1

我有一个具有以下结构和数据的表:

batsman | runs | year

 1      | 800  | 2012
 1      | 950  | 2011
 1      | 1050 | 2010
 2      | 550  | 2012
 2      | 650  | 2011
 2      | 400  | 2010
 3      | 900  | 2012

此数据需要通过 sql 查询选择为:

batsman | 2012 | 2011 | 2010

  1     | 800  | 950  | 1050
  2     | 550  | 650  | 400
  3     | 900  |  -   |  -

我正在尝试通过存储过程来做到这一点。可以假设列数(以年计)是固定的: 3. 另请注意,没有必要的算术运算 - 我需要的所有数字都已经存在,它们只需要按列表示。

4

3 回答 3

3

有几种方法可以将数据行转换为列。

在 SQL Server 中,您可以使用 PIVOT 函数:

select batsman, [2012], [2011], [2010]
from 
(
  select batsman, runs, year
  from yourtable
) d
pivot
(
  sum(runs)
  for year in ([2012], [2011], [2010])
) piv;

或者您可以使用带有CASE表达式的聚合函数:

select batsman,
  sum(case when year = 2012 then runs else 0 end) [2012],
  sum(case when year = 2011 then runs else 0 end) [2011],
  sum(case when year = 2010 then runs else 0 end) [2010]
from yourtable
group by batsman;

如果您有已知数量的列,则另一个版本会很好用。但是,如果您要拥有未知数量的year值,那么您将需要使用动态 SQL:

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

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

set @query = 'SELECT batsman,' + @cols + ' 
            from 
            (
                select batsman, runs, year
                from yourtable
            ) x
            pivot 
            (
                sum(runs)
                for year in (' + @cols + ')
            ) p '

execute(@query)
于 2013-04-30T11:32:19.170 回答
1

请尝试 PIVOT:

declare @tbl as table(batsman int, runs int, yearr int)
insert into @tbl values
(1, 800, 2012),
(1, 950, 2011),
(1, 1050, 2010),
(2, 550, 2012),
(2, 650, 2011),
(2, 400, 2010),
(3, 900, 2012)

select * From @tbl

select *
from
(
  select *
  from @tbl
) d
pivot
(
  max(runs)
  for yearr in ([2012], [2011], [2010])
) piv;
于 2013-04-30T11:31:51.053 回答
1

您需要使用此处详述的数据透视表:http: //blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx

例如:

select * from batsman
pivot (runs for Year in ([2012], [2011], [2010])) as runsperyear
于 2013-04-30T11:31:55.833 回答