2017-08-17 20 views
0

下面我有一個表時: -列在SQL Server 2012中使用排unpivot的沒有任何標識

X_Q1 | X_Q2 | X_Q3 | X_Q4 | Y_Q1 | Y_Q2 | Y_Q3 | Y_Q4 
---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- 
4500 | 3400 | 4600 | 3456 | 3435 | 7643 | 3214 | 43434 

腳本:

Create table #Temp 
(
    X_Q1 int, 
    X_Q2 int, 
    X_Q3 int, 
    X_Q4 int, 
    Y_Q1 int, 
    Y_Q2 int, 
    Y_Q3 int, 
    Y_Q4 int 
    ) 

insert into #Temp values(4500,3400,4600,3456,3435,7643,3214,43434) 

select * from #Temp 
drop table #Temp 

我想在下面的格式輸出: -

Code |  X | Y 
---- | ---- | ---- 
Q1 | 4500 | 3435 
Q2 | 3400 | 7643 
Q3 | 4600 | 3214 
Q4 | 3456 | 43434 
+0

既不PIVOT也不UNPIVOT需要任何ID。你有沒有試過*寫一個UNPIVOT查詢?編寫一個返回代碼和值列的查詢很容易,其中'Code'是原始列的名稱。儘管如此,UNPIVOT不會解析列名。你發佈的內容並不是無意義的。 –

回答

0

PIVOT和UNPIVOT不需要ID或列的其他獨特的組合。你可以隨便寫:

select code, value 
from (
     select   
      X_Q1, X_Q2, X_Q3, X_Q4, 
      Y_Q1, Y_Q2, Y_Q3, Y_Q4 
     from #temp 
    ) p 
    unpivot 
    (
     Value for code in 
     (
      X_Q1, X_Q2, X_Q3, X_Q4, 
      Y_Q1, Y_Q2, Y_Q3, Y_Q4 
     ) 
    ) as upvt 

的數據逆轉置成:

code value 
X_Q1 4500 
X_Q2 3400 
X_Q3 4600 
X_Q4 3456 
Y_Q1 3435 
Y_Q2 7643 
Y_Q3 3214 
Y_Q4 43434 

所需輸出雖然需要解析的代碼分成兩個單獨的列,並PIVOT再次荷蘭國際集團向X和Y轉換成列。 PIVOT始終與聚合功能一起使用。在你的表只有一行的微不足道的情況下,這並不重要。最有可能的,雖然,你現在需要一個ID,以避免聚集多個行值到一個:由ROW_NUMBER() over (order by (select null))產生

with xy as (
    select 
     ID, 
     left(code,1) as col, 
     SUBSTRING(code,3,10) as code, 
     value 
    from (
      select   
       ROW_NUMBER() over (order by (select null)) as ID, 
       X_Q1, X_Q2, X_Q3, X_Q4, 
       Y_Q1, Y_Q2, Y_Q3, Y_Q4 
      from #temp 
     ) p 
     unpivot 
     (
      Value for code in 
      (
       X_Q1, X_Q2, X_Q3, X_Q4, 
       Y_Q1, Y_Q2, Y_Q3, Y_Q4 
      ) 
     ) as upvt 
) 
select 
    ID,code, [X],[Y] 
from xy 
PIVOT( 
    sum(value) 
    for col in ([X],[Y]) 
) as pvt 
order by ID 

行ID。 xy CTE用於將代碼拆分爲帶有X,Y值和新的code字段的col字段。

使用X,Y作爲新的字段名稱再次對此結果進行PIVOT處理。

結果是:

ID code X  Y 
1 Q1  4500 3435 
1 Q2  3400 7643 
1 Q3  4600 3214 
1 Q4  3456 43434