2013-05-20 50 views
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 

但是,有聚合信息到另一个两列被称为“月”和“年”和组这样的说法的方式,离开我的灵活性以预超多选择查询不同的时间段?

+0

是 “DTE” 日期类型或整数类型的列? –

+0

@ MikeSherrill'Catcall'DTE是一种十进制小数。 – gsforfree

+0

@gsforfree为什么要将日期存储为小数? – Taryn

回答

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

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)) 
+0

我想出了类似的东西: 'YEAR(CONVERT(DATETIME,CONVERT(VARCHAR(8),[t]。[DTE])) )AS CAP_YR'这比您的解决方案更昂贵吗? – gsforfree

1

另一个想法 - 用DIV /模运算符:

select (dte/10000) dte_year, ((dte % 10000)/100) dte_month,sum(cntr) 
from tablename 
group by (dte/10000) , ((dte % 10000)/100)