【问题标题】:Pivot/Unpivot multiple columns [closed]透视/取消透视多列[关闭]
【发布时间】:2015-10-20 03:48:12
【问题描述】:

我如何获取数据:

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

我是否使用多个 PIVOTS?!?!

【问题讨论】:

  • 表格中的行数是否可变?

标签: sql sql-server pivot unpivot


【解决方案1】:
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

【讨论】:

  • @DarkKnight 的上述解决方案给我留下了深刻的印象,我认为它可以满足任意数量的 OrderID,我很高兴使用这个解决方案,因为我没有指定只有 2 个可能的 OrderID,我在 UDF 中编写了这个,我将 2 个可能的 Ver ID 作为 2 个单独的参数传递,我也不能在函数中使用动态 sql。所以谢谢你。
【解决方案2】:

以下查询适用于任意数量的行。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多