0

我有一个包含以下示例信息的数据集:

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

但是,有没有办法将这些信息聚合到另外两个名为“月”和“年”的列中并以这种方式进行分组,让我可以灵活地在许多不同的时间段内执行选择查询?

4

3 回答 3

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是日期数据类型。

于 2013-05-20T15:15:47.387 回答
1

另一个想法 - 使用 div/modulo 运算符:

select (dte / 10000) dte_year, ((dte % 10000) / 100) dte_month,sum(cntr) 
from tablename
group by (dte / 10000) , ((dte % 10000) / 100)
于 2013-05-20T15:16:09.293 回答
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))
于 2013-05-20T15:14:12.000 回答