我有一个包含以下样本信息的数据集:
ID DTE CNTR
1 20110102.0 2
1 20110204.0 3
1 20110103.0 5
2 20110205.0 6
2 20110301.0 7
2 20110302.0 3
如果我想按月对信息进行分组并对计数器求和,那么我猜的代码就是:
SELECT t.ID,
,SUM CASE(WHEN t.DTE between 20110101 and 20110131 then t.CNTR else 0) as Jan
,SUM CASE(WHEN t.DTE between 20110201 and 20110228 then t.CNTR else 0) as Feb
,SUM CASE(WHEN t.DTE between 20110301 and 20110331 then t.CNTR else 0) as Mar
FROM table t
GROUP BY t.ID
但是,有没有办法将这些信息聚合到另外两个名为“月”和“年”的列中,并将其分组,这使我能够灵活地在许多不同的时间段内执行选择查询?
答案 0 :(得分:6)
编辑,因为您的数据类型是小数,您可以使用以下内容:
select ID,
left(dte, 4) year,
SUBSTRING(cast(dte as varchar(8)), 5, 2) mth,
sum(CNTR) Total
from yt
group by id, left(dte, 4), SUBSTRING(cast(dte as varchar(8)), 5, 2)
我的建议是使用正确的日期时间数据类型。然后,如果您想要列中每个月的数据,那么您可以使用:
SELECT t.ID
, SUM(CASE WHEN t.DTE between '20110101' and '20110131' then t.CNTR else 0 end) as Jan
, SUM(CASE WHEN t.DTE between '20110201' and '20110228' then t.CNTR else 0 end) as Feb
, SUM(CASE WHEN t.DTE between '20110301' and '20110331' then t.CNTR else 0 end) as Mar
, year(dte)
FROM yt t
GROUP BY t.ID, year(dte);
此查询包含一个列,用于获取每个DTE
值的年份。
如果您希望结果包含多行而不是列,则可以使用:
select ID,
YEAR(dte) year,
datename(m, dte) month,
sum(CNTR) Total
from yt
group by id, year(dte), datename(m, dte);
注意,这假定DTE
是日期数据类型。
答案 1 :(得分:1)
另一个想法 - 使用div / modulo运算符:
select (dte / 10000) dte_year, ((dte % 10000) / 100) dte_month,sum(cntr)
from tablename
group by (dte / 10000) , ((dte % 10000) / 100)
答案 2 :(得分:0)
select id,
datepart(yy, convert(datetime, dte, 112)),
datepart(mm, convert(datetime, dte, 112)),
sum(cntr)
from table
group by id,
datepart(yy, convert(datetime, dte, 112)),
datepart(mm, convert(datetime, dte, 112))