2013-12-11 155 views
1

這可能是一個容易的,我只是有一個大腦放屁。我有一個涵蓋數年的日期列。我怎樣才能查詢一年分解?例如:SQL按年分列日期列?

Code - Date  - CustName - Sales 
1001 - 2011-01-12 - Sparkies - 50 
1002 - 2012-02-11 - Spankies - 125 
1001 - 2013-01-12 - Sparkies - 60 
1003 - 2011-05-05 - Squirrelies - 75 

我想一份報告顯示:

Code - CustName - 2011 - 2012 - 2013 
1001 - Sparkies - 50 - 0 - 60 
1002 - Spankies - 0 - 125 - 0 
1003 - Squirrelies - 75 - 0 - 0 

這是在2008年MSSQL R2。在此先感謝...

+0

您使用MYSQL/MS SQL嗎? – Deepshikha

+0

編輯添加:MSSQL 2008 R2 – user3059028

+0

對於給定的'CustName',每年是否會有多於一行?如果是這樣,該行/列的最終價值是什麼?和?民?馬克斯?平均? –

回答

1

您可以使用類似:

SELECT 
    [Code], 
    [CustName], 
    SUM(CASE WHEN YEAR([Date]) = 2011 THEN [Sales] ELSE 0 END) AS [2011], 
    SUM(CASE WHEN YEAR([Date]) = 2012 THEN [Sales] ELSE 0 END) AS [2012], 
    SUM(CASE WHEN YEAR([Date]) = 2013 THEN [Sales] ELSE 0 END) AS [2013] 
FROM 
    [Table] 
GROUP BY 
    [Code], 
    [CustName] 

或者,如果你喜歡它,看看使用PIVOT

+0

這不可擴縮。 – Kermit

+0

@FreshPrinceOfSO'可升級'是什麼意思,還有什麼替代方案? –

+0

如果OP只與3年合作,這將工作。如果你希望它是可重用和可擴展的,那麼'PIVOT'就是解決方案。 – Kermit

-1
SELECT CAST(YEAR(Date) AS VARCHAR(4)) AS Year, SUM(Sales) AS Sales 
FROM Orders 
GROUP BY CAST(YEAR(Date) AS VARCHAR(4)) 
ORDER BY Year 
+0

OP正在尋找一個'PIVOT'。 – Kermit

+0

樞軸真的能起作用嗎?你談論的是正在擴展的查詢,但是如果你使用一個數據透視表,你仍然必須像@Alex Humphrey的查詢一樣列出列。 –

+0

至少,這裏需要的是Alex Humphrey的回答。這裏真正應該使用的是bluefeet提供的動態數據透視解決方案。 – Kermit

3

您可以使用PIVOT函數來獲得結果。如果你有值的數量有限,那麼你會硬編碼類似查詢:

select code, custname, 
    [2011], [2012], [2013] 
from 
(
    select code, year(date) dt, 
    custname, sales 
    from yourtable 
) d 
pivot 
(
    sum(sales) 
    for dt in ([2011], [2012], [2013]) 
) piv; 

SQL Fiddle with Demo

但如果你有一個未知的數年,那麼你就需要看看使用動態SQL得到最終結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(year(date)) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT code, custname, ' + @cols + ' 
      from 
      (
       select code, year(date) dt, 
       custname, sales 
       from yourtable 
      ) x 
      pivot 
      (
       sum(sales) 
       for dt in (' + @cols + ') 
      ) p ' 

execute sp_executesql @query; 

SQL Fiddle with Demo。這些將產生以下結果:

| CODE | CUSTNAME | 2011 | 2012 | 2013 | 
|------|-------------|--------|--------|--------| 
| 1001 | Sparkies |  50 | (null) |  60 | 
| 1002 | Spankies | (null) | 125 | (null) | 
| 1003 | Squirrelies |  75 | (null) | (null) |