2016-09-29 27 views
1

我有一个输出看起来像这样:SQL服务器:如何将行转换成列

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

这样的例子不胜枚举和。科尔重复一系列a,b,c,并且可能有重复的值,但我想这没有关系,因为colB会有不同的值。

我想使它看起来像这样

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

我知道我可以透视表做到这一点,但我想这样做在SQL Server中,因为我有这么多的行。 谁能告诉我如何做到这一点?

+1

看一看[枢轴(HTTPS://technet.mic rosoft.com/nl-nl/library/ms177410(v=sql.105).aspx) – NickyvV

+0

这很容易理解,简短而甜美:http://www.codeproject.com/Tips/500811/Simple-Way- SQL数据库查询 – montewhizdoh

回答

3

简单PIVOT:

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 
+0

非常感谢。 – Nayana

+0

我有一个问题,如果我不知道colB中的值,该怎么办?有这么多。我无法全部指定。其中一些没有价值。 – Nayana

0

它是一种LSO可以通过使用dynamic SQL pivot query改善帕维尔的解决方案如下

这将带你任务,从第二列创建可能的数据值的列清单

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 )