2017-10-04 45 views
2

試想源表的模式:如何扁平SQL錶轉換爲行(約UNPIVOTting)

Table1: ID*, ValueA, ValueB, ValueX1, ValueX2, ValueX3, ValueY1, ValueY2, ValueY3 

和目標表架構:

TableA: ID*, ValueA, ValueB 
TableB: ID*, Type*, Value1, Value2, Value3 

Table1單排可表示爲TableA中的1行和TableB中的2行(其中一個具有類型X,另一個具有類型Y


是的,以前的模式的存在讓我難過。不,我沒有寫。不,我不能直接改變它。 :(


我想糾正一個查詢Table1轉換成TableB(顯然,越來越TableA容易。)

我知道如何與一個UNION ALL做到這一點,但是這將是醜陋(這不僅是因爲(X,Y)實際上是(P,Q,R,S,T,U,V,W,X,Y,Z),並且1 ... 3實際上是1 ... 15。嘆氣)

我覺得PIVOT/UNPIVOT有幾分隱約關閉,但我看不到有什麼具體處理這個問題 - 我總是看到一些只移動單列或單列的東西。

在任何意義上,這都可以在T-SQL中優雅地完成嗎?

回答

2

您正在尋找此

Cross Apply方法:(首選)

SELECT ID, tc.Type, tc.Value1, tc.Value2, tc.Value3 
FROM yourtable 
     CROSS apply (VALUES (ValueX1,ValueX2,ValueX3,'X'), 
          (ValueY1,ValueY2,ValueY3,'Y'))tc (Value1, Value2, Value3, Type) 

UNION ALL方法

SELECT ID,type = 'X',ValueX1,ValueX2,ValueX3 
FROM yourtable 
UNION ALL 
SELECT ID,'Y', ValueY1,ValueY2,ValueY3 
FROM yourtable 

注意兩種方法認爲,中ValueX1ValueY1數據類型爲隱含地可兌換或相同。同樣對剩餘的配對也是如此

+0

完美!非常感謝。數據類型的一致性是一個要求。 (他說,意識到他沒有真正檢查過它是否真實,並且對原始模式的設計者幾乎沒有信心) – Brondahl