聚合行标签

时间:2017-02-08 16:17:16

标签: sql sql-server-2012

下面的代码按照他们所属的商店代码列出帐号,并在帐户旁边放置一个标签,例如“过期”,“有效”或“旧”。我希望能够通过每个商店代码创建一个摘要,显示他们拥有的每种帐户类型的数量,例如shop_thames = 1 old,4 active和10 expired。我怎么做到这一点?

SELECT
shop_code,
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type,
account_id,
SUM(Revenue) AS Spend

FROM 
[company].[dbo].name

WHERE
Date_Reporting_LY = '2016'
AND  Total_Revenue > 0

GROUP BY
shop_code,
account_id

2 个答案:

答案 0 :(得分:0)

这样的事情应该这样做:

select  shop_code, account_type, count(*)
  from (SELECT  shop_code,
               CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type
          FROM  [company].[dbo].name    
         WHERE Date_Reporting_LY = '2016'
           AND  Total_Revenue > 0 ) x   
GROUP BY  shop_code, Account_Type

答案 1 :(得分:0)

保持您的查询大致不变,并将其包装在另一个选择中:

SELECT shop_code, account_type, count(*)
FROM (
SELECT
shop_code,
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END AS Account_Type,
account_id,
SUM(Revenue) AS Spend

FROM 
[company].[dbo].name

WHERE
Date_Reporting_LY = '2016'
AND  Total_Revenue > 0

GROUP BY
shop_code,
CASE WHEN MAX(i_date) < DATEADD(day , - 180 , GETDATE()) THEN 'Expired' WHEN MAX(i_date) > DATEADD(day , - 30 , GETDATE())THEN 'Active' ELSE 'Old' END
account_id
) x
GROUP BY 
shop_code,
account_type

对原始查询进行了一次更改--MySQL并不坚持按聚合函数外部的选择中的所有元素进行分组,但这是最佳实践。如果按整个案例陈述进行分组,如图所示,则可以避免因无法看到的值汇总问题。