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)
我感到困惑的地方是我想保留两个列并只旋转其他两个字段.任何人都知道我会怎么做.
非常感谢您的帮助/时间.我从来没有发布其中的一个,非常感谢您的回复!
您没有指定您正在使用的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 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 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)
所有版本都会产生结果:
| ID | NAME | DECEMBER2012 | JANUARY2013 |
-------------------------------------------
| 1 | David | 500 | 400 |
| 2 | Rob | 320 | 280 |
Run Code Online (Sandbox Code Playgroud)