下面的代码按照他们所属的商店代码列出帐号,并在帐户旁边放置一个标签,例如“过期”,“有效”或“旧”。我希望能够通过每个商店代码创建一个摘要,显示他们拥有的每种帐户类型的数量,例如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
答案 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并不坚持按聚合函数外部的选择中的所有元素进行分组,但这是最佳实践。如果按整个案例陈述进行分组,如图所示,则可以避免因无法看到的值汇总问题。