2017-08-25 26 views
1

使用SQL Server 2014 SP2的较新SQL用户。选择“case when ... ...产生分组结果...如何获得聚合数据?

我想确定如何改进我的结果在一个特定的查询。

问题是,当我用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几个变种,我尝试了几个case when的变种,但我似乎无法弄清楚我做错了什么...

任何有识之士将不胜感激!

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

我会把查询的CTE,然后从那里

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 

希望它聚集这会有所帮助,并请让我知道,如果有任何错误!

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]