SQL Server:如何将行转换为列

SQL Server:如何将行转换为列,sql,sql-server,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的序列,可能会有重复的值,但我想这并不

我的输出如下所示:

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
我知道我可以用pivot表来完成,但我想在sql server中完成,因为我有太多的行。 有人能告诉我如何做到这一点吗

简单枢轴:

SELECT *
FROM YourTable
PIVOT (SUM(Value) FOR colB IN (a,b,c)) P

示例

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

也可以使用以下方法改进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
输出如下面的屏幕截图所示

有关示例数据:

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   )

看一看这个简单易懂,简短而甜蜜的句子:非常感谢。我有一个问题,如果我不知道colB的值该怎么办。有那么多。我不能一一列举。而且其中一些没有价值观。