2012-07-07 72 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