2016-09-29 30 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 )