SQL按月份组
问题描述:
我有一张销售数据表,每行显示销售日期mm/dd/yy。SQL按月份组
我试图创建一个查询,所以我可以看到我有每个月的总销售额。 我是否必须创建一个单独的只指定月份的列?或者有没有一种方法可以采用该日期格式的月份?
答
简短的回答是:你不需要一个单独的列。你可以通过函数调用的结果进行分组。
该函数可能依赖于数据库的详细信息,您希望格式化结果的方式以及性能注意事项。
下在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');
答
以下查询会有帮助。
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)