2017-08-25 4 views
1

新しいSQLユーザーがSQL Server 2014 SP2を使用しています。「ケースは...」を選択...グループ化された結果...集計データの取得方法は?

特定のクエリで結果を改善する方法を決定しようとしています。

問題は、Case Whenでデータを選択すると、group byを使用してデータを集計する必要があることです。

私はこのgroup byを排除しようとしており、このクエリで実行可能な方法を判断できませんでした。

クエリは、これらの結果が得られます。

StoreID Devices playing devices FullScreenPlays PIPPlays 
-------------------------------------------------------- 
1296  1   0    0   0 
1296  7   7    7   0 
1296  7   7    0   7 

私はもっとこのような何かを達成しようとしています:

StoreID Devices playing devices FullScreenPlays PIPPlays 
-------------------------------------------------------------- 
    1296  8   7    7   7 

私はgroup byを呼び出すにはいくつかのバリエーションを試してみた、と私はいくつか試してみました私は何が間違っているのか分からないようです...

洞察力があれば幸いです!

SQLコードはここにある:

DECLARE @Location varchar(50) = '1296' 

SELECT 
    Location.ExternalCode As [StoreID], 
    COUNT(DISTINCT imdd.DeviceID) AS Devices, 
    COUNT(DISTINCT esr.DeviceID) AS [playing devices], 
    (CASE 
     WHEN (esr.EventID = 925) 
      THEN (COUNT(DISTINCT esr.DeviceID)) 
      ELSE 0 
    END) AS [FullScreenPlays], 
    (CASE 
     WHEN (esr.EventID = 926) 
      THEN (COUNT(DISTINCT esr.DeviceID)) 
      ELSE 0 
    END) AS [PIPPlays] 
FROM 
    [iSenseMD].dbo.Location WITH (NOLOCK) 
INNER JOIN 
    iSenseMD.dbo.LocationAttribute la WITH (NOLOCK) ON Location.LocationID = la.LocationID 
                AND la.AttributeID = 7 
                AND la.Value = 1 
LEFT JOIN 
    [iSenseMD].[dbo].Device imdd WITH (NOLOCK) ON location.LocationID = imdd.LocationID 
               AND imdd.DeviceName NOT IN ('iX Gateway', 'A312778', 'A294874', '334873') 
LEFT JOIN 
    [iSenseAnalytics].[dbo].[EventStringRollup] esr WITH (NOLOCK) ON imdd.LocationID = esr.LocationID 
                    AND imdd.DeviceID = esr.DeviceID 
                    AND esr.IntervalID = 1 
                    AND esr.EventID IN (925, 926) --all plays 
                    AND esr.RollupTimestamp >= dateadd(day, datediff(day, 1, GETDATE()), 0) 
                    AND esr.RollupTimestamp < dateadd(day, datediff(day, 0, GETDATE()), 0) 
WHERE 
    Location.IsActive = 1 
    AND Location.LocationName NOT LIKE '%duplicate%' 
    AND Location.ExternalCode = @Location --this to add the declaration above as site constraint 
GROUP BY 
    Location.ExternalCode, esr.EventID 
ORDER BY 
    iSenseMD.dbo.Location.ExternalCode 

任意の洞察力をいただければ幸いです!

ありがとうございます!

答えて

0

私は希望は、このことができますし、エラーがある場合は私に知らせてください

WITH CTE_Example 
AS 
( use iSenseMD 
go 

DECLARE @Location varchar(50) = '1296' 

SELECT Location.ExternalCode As [StoreID] 
,count(distinct imdd.DeviceID) as Devices 
,count(distinct esr.DeviceID) as [playing devices] 
,(case when (esr.EventID = 925) Then (count (distinct esr.DeviceID)) Else 0 End) As [FullScreenPlays] 
,(case when (esr.EventID = 926) Then (count (distinct esr.DeviceID)) Else 0 End) As [PIPPlays] 


FROM [iSenseMD].dbo.Location WITH (NOLOCK) 

INNER JOIN iSenseMD.dbo.LocationAttribute la WITH (NOLOCK) 
    ON Location.LocationID = la.LocationID 
    AND la.AttributeID = 7 
    AND la.Value = 1 

left JOIN [iSenseMD].[dbo].Device imdd WITH (NOLOCK) ON location.LocationID = imdd.LocationID 
    AND imdd.DeviceName NOT IN ('iX Gateway','A312778','A294874','334873') 

left JOIN [iSenseAnalytics].[dbo].[EventStringRollup] esr WITH (NOLOCK) ON imdd.LocationID = esr.LocationID and imdd.DeviceID = esr.DeviceID 
    AND esr.IntervalID = 1 
    AND esr.EventID IN (925, 926) --all plays 
    AND esr.RollupTimestamp >= dateadd(day,datediff(day,1,GETDATE()),0) 
    AND esr.RollupTimestamp < dateadd(day,datediff(day,0,GETDATE()),0) 



WHERE Location.IsActive = 1 
    AND Location.LocationName NOT LIKE '%duplicate%' 
    AND Location.ExternalCode = @Location --this to add the declaration above as site constraint 

GROUP BY Location.ExternalCode 
    ,esr.EventID) 

--A GROUP BY might not be allowed either, I can't remember. But I think it'll be fine, let me know if there are any issues 

/* ORDER BY 
    iSenseMD.dbo.Location.ExternalCode */ 
--I don't think an ORDER BY is allowed in a CTE so I have it commented out for now. Is it an absolute within the query? 

SELECT StoreID, SUM(Devices), SUM([playing devices]), SUM(FullScreenPlays), 
SUM(PIPPlays) 
FROM CTE_Example 
GROUP BY StoreID 

をCTEにクエリを入れて、そこから

それを集約します!

0

caseステートメントをcount集約内に配置する必要があります。この方法は、あなたがgroup by

例でEventIDを削除することができます。

COUNT(DISTINCT 
     CASE WHEN (esr.EventID = 925) THEN esr.DeviceID 
     ELSE NULL 
    END) AS [FullScreenPlays] 

オリジナル:

(CASE 
    WHEN (esr.EventID = 925) 
    THEN (COUNT(DISTINCT esr.DeviceID)) 
    ELSE 0 
END) AS [FullScreenPlays] 
関連する問題