2017-08-29 79 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)