SQL,多行到一列

use*_*103 1 sql pivot rows multiple-columns

所以我有以下日期

ID       NAME       MONTH              COUNT

1        David      December2012       500

2        Rob        December2012       320

1        David      January2013        400

2        Rob        January2013        280
Run Code Online (Sandbox Code Playgroud)

我想做这个.......

ID       Name       December2012       January2013

1        David      500                400

2        Rob        320                280
Run Code Online (Sandbox Code Playgroud)

我感到困惑的地方是我想保留两个列并只旋转其他两个字段.任何人都知道我会怎么做.

非常感谢您的帮助/时间.我从来没有发布其中的一个,非常感谢您的回复!

Tar*_*ryn 5

您没有指定您正在使用的RDBMS.您可以使用带有表达式的聚合函数来转动所有数据库中的数据CASE:

select id, name, 
  sum(case when month = 'December2012' then "count" end) December2012,
  sum(case when month = 'January2013' then "count" end) January2013
from yourtable
group by id, name
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

如果您使用的是SQL Server 2005+或Oracle 11g,则可以使用以下PIVOT功能:

select *
from
(
  select id, name, month, [count]
  from yourtable
) src
pivot
(
  sum([count])
  for month in (December2012, January2013)
) piv
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.

在SQL Server中,如果month未知的值,则可以使用与此类似的动态SQL:

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

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

set @query = 'SELECT id, name,' + @cols + ' from 
             (
                select id, name, month, [count]
                from yourtable
            ) x
            pivot 
            (
                sum([count])
                for month in (' + @cols + ')
            ) p '

execute(@query)
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo

所有版本都会产生结果:

| ID |  NAME | DECEMBER2012 | JANUARY2013 |
-------------------------------------------
|  1 | David |          500 |         400 |
|  2 |   Rob |          320 |         280 |
Run Code Online (Sandbox Code Playgroud)