2017-02-08 41 views
0

下面的代碼按其所屬商店代碼列出了帳戶號碼,並在帳戶旁放置了諸如「過期」,「活動」或「舊」之類的標籤。我希望能夠根據每個商店代碼創建一個彙總,其中顯示了每個商店類型中有多少個商店,例如shop_thames = 1老,4個活動和10個過期。我將如何實現這一目標?聚合行標籤

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

sql-server-2012 – 80gm2

回答

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 
+0

我已經試過這個,它只是給了我1個結果列中的值。然後我試着做一些SUM(外部選擇中的CASE語句來查看這是否會起作用,但我只能得到0或1.我認爲這是因爲它正在反對商店代碼,而不是通過account_id加起來的值。 – 80gm2

+0

嘗試用shop_code替換account_id然後 – MikeS

+0

因爲它不會按商店代碼合計每個賬戶類型 – 80gm2

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的並不強調你在集合函數外選擇了所有的元素,但這是最好的實踐。如圖所示,如果您按照整個案例分組進行分組,則可避免按您無法看到的值進行聚合時出現問題。