2016-09-19 69 views
2

我試圖獲得按年份和國家/地區分組的總銷售額。這按預期工作:使用GROUP BY和OVER

SELECT Year, Country, SUM([Total Sales]) 
FROM Table 
GROUP BY Country, Year; 

然後,我必須比較每個國家對一年總銷售額的貢獻。我這樣做:

SELECT Year, Country, SUM([Total Sales]), 
    SUM([Total Sales]) OVER(PARTITION BY Year) 
FROM Table 
GROUP BY Country, Year; 

這給了我這個錯誤:

Column 'Table.Total Sales' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

回答

4

您需要嵌套的款項:

SELECT Year, Country, SUM([Total Sales]), 
     SUM(SUM([Total Sales])) OVER (PARTITION BY Year) 
FROM Table 
GROUP BY Country, Year; 

第一次看到它時,這個語法有點時髦。但是,窗口函數在,GROUP BY之後被評估爲。這說的是總和銷售額的總和。 。 。正是你想要的。

2

這是因爲你可以用SUM()GROUP BY並與你的窗口功能的窗口級別查詢級別不聚集。這是因爲窗口函數在應用了結果集之後發生,包括GROUP BY。在那個時間點,[total sales]列僅在原始表格中作爲非聚合字段存在,因此您最終會發現無意義。你可以先聚集在子查詢,然後做最重要的是你的窗口:

SELECT Year, Country, Total_Sales, SUM([Total_Sales]) OVER(PARTITION BY Year) 
FROM 
(
    SELECT Year, Country, SUM([Total Sales])  
    FROM Table 
    GROUP BY Country, Year 
) sub 
+1

您的第一句話是誤導性的,因爲您可以在不使用子查詢的情況下合併窗口函數和聚合函數。 –

0

我想你可以不用GROUP BY子句通過以下方式:

SELECT 
    Year, 
    Country, 
    SUM([Total Sales]) OVER(), 
    SUM([Total Sales]) OVER (PARTITION BY Year) 
FROM Table 
0

正如提到的錯誤,您需要在Group by中添加列當前窗口集合函數,但這會導致聚合錯誤。

如果你想找到的每個companyyear的貢獻嘗試這樣的事情

SELECT year, 
     country, 
     Sum([total sales]), 
     OA.year_total, 
     (Sum([total sales])/NULLIF(OA.year_total,0)) * 100 AS Percent_contribution 
FROM table 
     OUTER apply (SELECT Sum(b.[total sales]) AS year_total 
        FROM table b 
        WHERE a.year = b.year) OA 
GROUP BY country, 
      year, 
      year_total; 

Outer Apply,這裏將計算出每個year的總和。我們可以用總和發現各公司的貢獻

使用JOIN

;WITH cte 
    AS (SELECT b.year, Sum(b.[total sales]) AS year_total 
     FROM table b 
     GROUP BY b.year) 
SELECT year, 
     country, 
     Sum([total sales]), 
     b.year_total, 
     (Sum([total sales])/NULLIF(b.year_total, 0)) * 100 AS Percent_contribution 
FROM table a 
     JOIN cte b 
     ON a.year = b.year 
GROUP BY year, 
      country, 
      b.year_total 
0

另一種方法嘗試

SELECT distinct Year, Country, SUM([Total Sales]) OVER(PARTITION BY Country, Year) sumbycountryyear, SUM([Total Sales]) OVER(PARTITION BY Year) sumbyyear 
FROM Table