2013-05-20 48 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)