2017-08-29 83 views
0

我有一張銷售數據表,每行顯示銷售日期mm/dd/yy。SQL按月份組

我試圖創建一個查詢,所以我可以看到我有每個月的總銷售額。 我是否必須創建一個單獨的只指定月份的列?或者有沒有一種方法可以採用該日期格式的月份?

回答

0

簡短的回答是:你不需要一個單獨的列。你可以通過函數調用的結果進行分組。

該函數可能依賴於數據庫的詳細信息,您希望格式化結果的方式以及性能注意事項。

下在Oracle中都工作:

SELECT extract(YEAR FROM ae.saledate), extract(MONTH FROM ae.saledate), count(*) 
FROM mytable ae 
GROUP BY extract(YEAR FROM ae.saledate), extract(MONTH FROM ae.saledate); 

SELECT TO_CHAR(ae.saledate, 'YYYY-MM'), count(*) 
FROM mytable ae 
GROUP BY TO_CHAR(ae.saledate, 'YYYY-MM'); 

編輯追加無視年版本和只能看着月(因爲我是做一個假設之上,在這個問題實際上不是):

SELECT extract(MONTH FROM ae.saledate), count(*) 
FROM mytable ae 
GROUP BY extract(MONTH FROM ae.saledate); 

SELECT TO_CHAR(ae.saledate, 'MM'), count(*) 
FROM mytable ae 
GROUP BY TO_CHAR(ae.saledate, 'MM'); 
0

以下查詢會有幫助。

CREATE TABLE #TEMP 
(SalesDate DATETime, 
Amount float 
) 
INSERT INTO #TEMP 
SELECT '2016-01-12', 12 
UNION 
SELECT '2016-01-13', 12 
UNION 
SELECT '2016-02-12', 12 
UNION 
SELECT '2016-03-12', 12 

SELECT CONVERT(VARCHAR(7), SalesDate, 120) AS 'YYYY-MM', 
SUM(Amount) as 'Amount' 
FROM #Temp 
GROUP BY CONVERT(VARCHAR(7), SalesDate, 120) 

OUTPUT:

YYYY-MM Amount 
------- ---------------------- 
2016-01 24 
2016-02 12 
2016-03 12 

(3 row(s) affected) 

僅適用於月懷斯

SELECT RIGHT(CONVERT(VARCHAR(7), SalesDate, 120), 2) AS 'MM', 
sum(Amount) as 'Amount' 
from #Temp 
group by RIGHT(CONVERT(VARCHAR(7), SalesDate, 120), 2) 

輸出:

MM Amount 
---- ---------------------- 
01 24 
02 12 
03 12 

(3 row(s) affected)