繁体   English   中英

使用oracle sql将行转换为列

[英]converting rows to columns using oracle sql

我正在尝试使用以下示例将行转换为列:

LVL COL_VALUE TABLE_SRC
16 INT:ADDRESS_LINE_2:NULL 情报局
16 基地:ADDRESS_LINE_2:X 根据
17 INT:ADDRESS_LINE_3:NULL 情报局
17 基地:ADDRESS_LINE_3:X 根据

输出应该是:

情报局 根据
INT:ADDRESS_LINE_2:NULL 基地:ADDRESS_LINE_2:X
INT:ADDRESS_LINE_3:NULL 基地:ADDRESS_LINE_3:X

具有相同 LVL 的 COL_VALUE 应该在 1 行

我尝试使用 PIVOT 但由于聚合函数它只返回 1 行

SELECT *
    FROM
        (
        SELECT 
                 BATCH_ID
                ,CONTACT_ID
                ,COL_VALUE
                ,TABLE_SRC
        FROM
            MISMATCH
        )
PIVOT
    (
        max(COL_VALUE) FOR TABLE_SRC IN ('1BASE' BASE, '1INT' INT)
    )

您可以在内部子查询中包含LVL

SELECT *
FROM   (
  SELECT  BATCH_ID
         ,CONTACT_ID
         ,COL_VALUE
         ,TABLE_SRC
         ,LVL
  FROM   MISMATCH
) PIVOT (
  max(COL_VALUE)
  FOR TABLE_SRC IN ('1BASE' BASE, '1INT' INT)
)

如果您不希望在输出中使用它,则从SELECT *更改为列列表。

其中,对于您的示例数据:

CREATE TABLE mismatch (batch_id, contact_id, LVL, COL_VALUE, TABLE_SRC) AS
SELECT 1, 1, 16, 'INT: ADDRESS_LINE_2:NULL', '1INT'  FROM DUAL UNION ALL
SELECT 1, 1, 16, 'BASE: ADDRESS_LINE_2:X',   '1BASE' FROM DUAL UNION ALL
SELECT 1, 1, 17, 'INT: ADDRESS_LINE_3:NULL', '1INT'  FROM DUAL UNION ALL
SELECT 1, 1, 17, 'BASE: ADDRESS_LINE_3:X',   '1BASE' FROM DUAL;

输出:

BATCH_ID CONTACT_ID LVL 根据 情报局
1 1 16 基地:ADDRESS_LINE_2:X INT:ADDRESS_LINE_2:NULL
1 1 17 基地:ADDRESS_LINE_3:X INT:ADDRESS_LINE_3:NULL

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM