我正在尝试移动一些行并将它们转换为列

I'm trying to move some rows and convert them as columns

我们能否通过使用 PIVOT 或其他方式获得以下所需的 table。我正在尝试将 table 以下转换为所需的输出,如下所示。

数据集:

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   

这可能有帮助

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_%',

根据您提供的示例数据,无法知道哪个 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