2012-07-07 76 views
2
ID Amount  Date 
------------------------------ 
1 300  02-02-2010 00:00 
2 400  02-02-2009 00:00 
3 200  02-02-2011 00:00 
4 300  22-02-2010 00:00 
5 400  12-02-2009 00:00 
6 500  22-02-2009 00:00 
7 600  02-02-2006 00:00 
8 700  02-07-2012 00:00 
9 500  08-02-2012 00:00 
10 800  09-02-2011 00:00 
11 500  06-02-2010 00:00 
12 600  01-02-2011 00:00 
13 300  02-02-2019 00:00 

所需的輸出:如何獲得列值到行標題

Y1   Y2   Y3 ........... 
sum(amount) sum(amount) sum(amount) 

什麼是一種方法,其中Y1是日期的年份部分,使得結果列將是下?

2006 2009 2010 2011 2012 
--------------------------------- 
    600 1300  800 1900 1200 

數據庫系統:SQL Server 2008中

回答

0

您需要使用dynamic PIVOT Table

DECLARE @Years nvarchar(max) 
SELECT @Years = 
    STUFF(
    (
    select distinct ',[' + cast(Year([date]) as nvarchar(4)) + ']' 
    from YOUR_TABLE_NAME_HERE 
    for xml path('') 
), 
    1,1,'') 

DECLARE @SQL nvarchar(max) 
SELECT @SQL = N' 
select 
    * 
from (
    select 
    amount, year([date]) as [y] 
    from YOUR_TABLE_NAME_HERE 
) Data 
PIVOT (
    sum(amount) 
    FOR [y] 
    IN (
    ' + @Years + ' 
) 
) PivotTable 
' 

EXECUTE (@SQL) 

參考:PIVOT Docs

+0

這似乎是一個有點複雜。我不知道xml路徑。有人能爲我輕鬆一點嗎? – syncdm2012 2012-07-07 10:01:27

+0

@DharmendraMohapatra,第一個'select'創建一個名爲'years'的變量,它具有'[2009],[2010],[2011]'等等(*它會創建一個由表*中不同年份組成的字符串) 。 我們這樣做是因爲這是我們在查詢的第二部分中使用的'PIVOT'命令所需的語法。 ([* MSDN'FOR XML' *](http://msdn.microsoft.com/en-us/library/ms178107.aspx)) – 2012-07-07 10:09:03

+0

@ Gaby aka G. Petrioli,謝謝 – syncdm2012 2012-07-09 05:44:55