2015-10-20 98 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