我正在尝试移动一些行并将其转换为列 示例结果

问题描述

我们可以通过使用PIVOT或以下方法获得所需的下表吗?我正在尝试将下表转换为所需的输出,如下所示。

数据集:

question_id    element_id
1              john
1              bran
1              o_siera
2              brook
2              joseph
2              o_daniel
2              o_cody
3              derick
3              james
3              sophia
3              o_sandra
3              o_ashley

所需结果:

我们可以这样实现吗

question_id    element_id       element
1              john             o_siera
1              bran             
2              brook            o_daniel,o_cody
2              joseph           
3              derick           o_sandra,o_ashley
3              james            
3              sophia   

解决方法

根据您提供的示例数据,无法知道哪个ELEMENT_ID旁边应该有ELEMENT列表。

您可以使用下面的查询,该查询将每个QUESTION_ID的ELEMENT列表按字母顺序放在第一个ELEMENT_ID旁边。

示例

WITH
    t (question_id,element_id)
    AS
        (SELECT 1,'john' FROM DUAL
         UNION ALL
         SELECT 1,'bran' FROM DUAL
         UNION ALL
         SELECT 1,'o_siera' FROM DUAL
         UNION ALL
         SELECT 2,'brook' FROM DUAL
         UNION ALL
         SELECT 2,'joseph' FROM DUAL
         UNION ALL
         SELECT 2,'o_daniel' FROM DUAL
         UNION ALL
         SELECT 2,'o_cody' FROM DUAL
         UNION ALL
         SELECT 3,'derick' FROM DUAL
         UNION ALL
         SELECT 3,'james' FROM DUAL
         UNION ALL
         SELECT 3,'sophia' FROM DUAL
         UNION ALL
         SELECT 3,'o_sandra' FROM DUAL
         UNION ALL
         SELECT 3,'o_ashley' FROM DUAL)
SELECT question_id,element_id,CASE
           WHEN ROW_NUMBER () OVER (PARTITION BY question_id ORDER BY element_id) = 1
           THEN
               (SELECT LISTAGG (t2.element_id,',')
                  FROM t t2
                 WHERE element_id LIKE 'o\_%' ESCAPE '\' AND t2.question_id = t1.question_id)
           ELSE
               NULL
       END    AS element
  FROM t t1
 WHERE element_id NOT LIKE 'o\_%' ESCAPE '\'
 order by question_id,element_id;

结果

   QUESTION_ID    ELEMENT_ID               ELEMENT
______________ _____________ _____________________
             1 bran          o_siera
             1 john
             2 brook         o_cody,o_daniel
             2 joseph
             3 derick        o_ashley,o_sandra
             3 james
             3 sophia
,

这可能会帮助

select * 
  (Select listagg(element_id,') within group (order by element_id) from tbl ti
    where ti.question_id = t.question_id
      and element_id like 'o%'
  ) element
from tbl t
where element_id not like 'o_%',

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...