【问题标题】:Transposing rows to columns in oracle在oracle中将行转换为列
【发布时间】:2020-03-24 19:42:07
【问题描述】:

我正在尝试将 Oracle 语句中的行转换为列。我一直在努力阅读,我想我需要的是 PIVOT。但是从无数的例子中我无法弄清楚我需要写什么。

我有两张桌子,一张是人的,一张是关系的。父母各有一个对孩子的引用,因此两个父母将是关系表中的两行。

人员表:

id        name
1         John Doe
2         Jane Doe
3         Johnny Doe

关系表:

person_1_id    person_2_id
1              3
2              3

所以如果我运行以下 SQL:

SELECT child.id AS child_id, r.person_1_id AS parent_id
    FROM person child
    JOIN relation r ON r.person_2_id = child.id;

我得到以下输出:

child_id    parent_id  
3           1  
3           2

我将如何获得输出:

child_id   parent_1_id   parent_2_id
3          1             2

我正在运行 Oracle 12c。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    你可以只使用聚合:

    SELECT child.id AS child_id,
           MIN(r.person_1_id) AS parent_id_1,
           NULLIF(MAX(r.person_1_id), MIN(r.person_1_id) AS parent_id_2
    FROM person child JOIN
         relation r
         ON r.person_2_id = child.id
    GROUP BY child.id;
    

    似乎不需要子查询。

    【讨论】:

      【解决方案2】:

      您可以使用条件聚合达到预期的结果,如下所示:

      SELECT
          CHILD_ID,
          MAX(CASE WHEN RN = 1 THEN PARENT_ID END) AS PARENT_1_ID,
          MAX(CASE WHEN RN = 2 THEN PARENT_ID END) AS PARENT_2_ID
      FROM
          ( SELECT
                CHILD.ID        AS CHILD_ID,
                R.PERSON_1_ID   AS PARENT_ID,
                ROW_NUMBER() OVER(PARTITION BY CHILD.ID ORDER BY R.PERSON_1_ID) AS RN
              FROM
                PERSON CHILD
                JOIN RELATION R ON R.PERSON_2_ID = CHILD.ID
          )
      GROUP BY CHILD_ID;
      

      【讨论】:

        猜你喜欢
        • 2013-01-12
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多