SQL Server:如何将行转换为列

时间:2016-09-29 07:59:17

标签: sql sql-server

我的输出看起来像这样:

colA | colB | Value
A    | a    | 46
A    | b    | 8979
A    | C    | 684168468
B    | a    | 68546841
B    | b    | 456846
B    | c    | 468468
C    | a    | 684684
.    | .    |  .
.    | .    |  .

列表一直在继续。 Colb重复a,b,c的序列,并且可能存在重复值,但我想它并不重要,因为它将具有不同的colB值。

我想让它看起来像这样

col A | a        | b      | c
A     | 46       | 8979   | 684168468
B     | 68546841 | 456846 | 468468
C     | 684684

我知道我可以使用数据透视表,但我想在sql server中执行它,因为我有很多行。 谁能告诉我如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

简单的PIVOT:

WITH Src AS
(
    SELECT * FROM (VALUES
    ('A', 'a', 46       ),
    ('A', 'b', 8979     ),
    ('A', 'C', 684168468),
    ('B', 'a', 68546841 ),
    ('B', 'b', 456846   ),
    ('B', 'c', 468468   ),
    ('C', 'a', 684684   )) T(colA, colB, Value)
)
SELECT *
FROM Src
PIVOT
(SUM(Value) FOR colB IN (a,b,c)) P

示例

colA a           b           c
---- ----------- ----------- -----------
A    46          8979        684168468
B    68546841    456846      468468
C    684684      NULL        NULL

<强>结果:

{{1}}

答案 1 :(得分:0)

使用dynamic SQL pivot query如下

也可以改善Pawel的解决方案

这将使您从第二列

中的可能数据值创建列列表
DECLARE @values varchar(max)
SELECT @values =
 STUFF(
 (
  select distinct ',[' + col2 + ']'
  from tblData
  for xml path('')
 ),
 1,1,'')

DECLARE @SQL nvarchar(max)
SELECT @SQL = N'
select
 *
from tblData
PIVOT (
 sum(val)
 FOR col2
 IN (
  ' + @values + '
 )
) PivotTable 
'
--print @SQL
exec sp_executesql @SQL

输出如下面的屏幕截图所示 enter image description here

样本数据:

create table tblData (col1 varchar(5),col2 varchar(5),val bigint)
insert into tblData values
    ('A', 'a', 46       ),
    ('A', 'b', 8979     ),
    ('A', 'C', 684168468),
    ('B', 'a', 68546841 ),
    ('B', 'b', 456846   ),
    ('B', 'c', 468468   ),
    ('C', 'a', 684684   )