2017-04-05 39 views
0

我想將一列分成許多列併合並一些列。我如何在SQL Server 2012中進行修改?SQL Server 2014:一列到多列,行較少,如何擺動一張表?

輸入

| Cust | Q  | Val  | 
------------------------------------ 
| 1  | 1  | 10  | 
| 2  | 2  | 20  | 
| 1  | 2  | 30  | 
| 4  | 4  | 40  | 
| 4  | 1  | 400  | 
| 4  | 2  | 4000 | 

輸出:如何到達這裏從輸入?

| Cust | ValQI | ValQII | ValQIII | VALQIV | 
----------------------------------------------------------------- 
| 1  | 10 | 30  |    |    | 
| 2  |   | 20  |    |    | 
| 3  |   |   |    |    | 
| 4  | 400 | 4000 |    |  40  | 
+0

有多少個不同的val你在Q? – etsa

+0

@每年有4個季度,所以10年有40個季度,依此類推。 – hhh

+0

如何獲得cust 3的輸出?我認爲你有一個記錄錯過了cust 3的輸入? –

回答

2

聯合PIVOT的LEFT OUTER JOIN

WITH C AS 
(
    SELECT * 
    FROM (VALUES (1), (2), (3), (4)) AS T(Cust) 
) 
SELECT C.Cust, [1] AS ValQI, [2] AS ValQII, [3] AS ValQIII, [4] AS ValQIV 
FROM C 
LEFT OUTER JOIN 
(
    SELEcT * 
    FROM 
    (VALUES 
     (1, 1, 10), 
     (2, 2, 20), 
     (1, 2, 30), 
     (4, 4, 40), 
     (4, 1, 400), 
     (4, 2, 4000) 
    ) AS T(Cust, Q, Val) 
    PIVOT (MAX([Val]) FOR [Q] IN ([1], [2], [3], [4])) AS P 
) AS TT ON C.Cust = TT.Cust 
+0

你能解釋一下'max'的用途嗎?這個案例沒有取得任何價值的最大值,所以我懷疑爲什麼它存在。 – hhh

+1

PIVOT內部執行GROUP BY。如何在組內獲得價值?就你而言,由於沒有重複,它可以是MIN/MAX/SUM/AVERAGE。 – qxg

+0

我認爲90是2005年和2012年是110.你可以通過'SELECT name,compatibility_level FROM sys.databases'檢查兼容性級別,並檢查https://docs.microsoft.com/en-us/sql/t- SQL /語句/更改的數據庫,與Transact-SQL兼容級? – qxg

0

可以使用旋轉在SQL Server中的SQL Server來轉這樣的數據..

;with cte as (
select cust, RowN = Row_Number() over (partition by cust order by q), val from #yourPivot) 
select * from cte 
pivot (max(val) for RowN in ([1],[2], [3],[4])) p 

您的輸入表:

create table #yourPivot (cust int, Q int, Val int) 

insert into #yourPivot (cust, q, val) values 
( 1 , 1  , 10  ) 
,( 2 , 2  , 20  ) 
,( 1 , 1  , 30  ) 
,( 4 , 4  , 40  ) 
,( 4 , 1  , 400 ) 
,( 4 , 2  , 4000 )