2015-10-20 96 views
-1

如何獲得數據:透視/逆透視多列

OrderID | Ver | Res | OI | Ret | Corp 
----------------------------------------------- 
     1 | 'BUD' | 57823 | 11111 | 34304 | 12344 
     2 | 'ACT' | 12345 | 23456 | 45678 | NULL 

Ver1 | Res1 | OI1 | Ret1 | Corp1 | Ver2 | Res2 | OI2 | Ret2 | Corp2 
----------------------------------------------------------------------------- 
'BUD' | 57823 | 11111 | 34304 | 12344 | 'ACT' | 12345 | 23456 | 45678 | NULL 

難道我使用多個支點?!?!

+0

表中的行數是否可變? – DarkKnight

回答

2
Without pivot it can be done by using this code : 

SELECT 
MAX(CASE WHEN ORDERID=1 THEN VER END) VER1, 
MAX(CASE WHEN ORDERID=1 THEN RES END) RES1, 
MAX(CASE WHEN ORDERID=1 THEN OI END) OI1, 
MAX(CASE WHEN ORDERID=1 THEN RET END)RET1, 
MAX(CASE WHEN ORDERID=1 THEN CORP END) CORP1, 

MAX(CASE WHEN ORDERID=2 THEN VER END)VER2, 
MAX(CASE WHEN ORDERID=2 THEN RES END) RES2, 
MAX(CASE WHEN ORDERID=2 THEN OI END) OI2, 
MAX(CASE WHEN ORDERID=2 THEN RET END)RET2, 
MAX(CASE WHEN ORDERID=2 THEN CORP END) CORP2 

FROM yourtable 
+0

儘管上面的解決方案給我留下了深刻的印象@DarkKnight,我認爲它可以滿足任意數量的OrderID,但我很樂意使用這個解決方案,因爲我沒有指定只有2個可能的OrderID,我正在編寫這個在UDF內部,我將2個可能的Ver ID作爲2個單獨的參數傳遞,我也不能在函數中使用動態sql。所以謝謝。 – Glen

0

以下查詢將適用於任意數量的行。

DECLARE @SQL NVARCHAR(MAX) 
WITH CTE 
AS 
(
SELECT 1 AS REF,Q,CONCAT(ITEM,ORDERID) AS COL FROM(
SELECT CAST(ORDERID AS VARCHAR(100)) AS ORDERID, 
CAST(VER AS VARCHAR(100)) AS VER, 
CAST(RES AS VARCHAR(100)) AS RES, 
CAST(OI AS VARCHAR(100)) AS OI, 
CAST(RET AS VARCHAR(100)) AS RET, 
CAST(CORP AS VARCHAR(100)) AS CORP FROM ORDERS) K 
UNPIVOT 
(Q FOR ITEM IN (VER,RES,[OI],RET,CORP)) UP 
) 

SELECT @SQL = N'WITH CTE 
AS 
(
SELECT 1 AS REF,Q,CONCAT(ITEM,ORDERID) AS COL FROM(
SELECT CAST(ORDERID AS VARCHAR(100)) AS ORDERID, 
CAST(VER AS VARCHAR(100)) AS VER, 
CAST(RES AS VARCHAR(100)) AS RES, 
CAST(OI AS VARCHAR(100)) AS OI, 
CAST(RET AS VARCHAR(100)) AS RET, 
CAST(CORP AS VARCHAR(100)) AS CORP FROM ORDERS) K 
UNPIVOT 
(Q FOR ITEM IN (VER,RES,[OI],RET,CORP)) UP 
) 
SELECT * FROM CTE 
PIVOT 
(MAX(Q) FOR COL IN ('+ STUFF((SELECT ','+COL FROM CTE FOR XML PATH('')),1,1,'') +')) P' 

EXEC SP_EXECUTESQL @SQL