繁体   English   中英

如何在 Oracle Sql 中获取单行但不同行(带换行符)的多行值

[英]How to get multiple row values in single row but in different line(with Line break) in Oracle Sql

在此处输入图像描述

这里上表是我的输入,下表是我需要的输出。

一个简单的选项是使用listagg聚合它们并将分隔符设置为换行符:

样本数据:

SQL> select * from temp;

WO TITLE
-- --------------------
W1 T1
W1 T2
W2 TT1

询问:

SQL> select workflow_id,
  2    listagg(title, chr(10)) within group (order by title) as title
  3  from temp
  4  group by workflow_id;

WO TITLE
-- --------------------
W1 T1
   T2

W2 TT1

SQL>

LISTAGG与新的行分隔符一起使用(假设您已经对行进行了排序):

SELECT workflow_id,
       LISTAGG(title, CHR(10)) WITHIN GROUP (ORDER BY ROWNUM) AS titles
FROM   table_name
GROUP BY workflow_id;

其中,对于样本数据:

CREATE TABLE table_name (workflow_id, title) AS
SELECT 'W1', 'd1' FROM DUAL UNION ALL
SELECT 'W1', 'd5' FROM DUAL UNION ALL
SELECT 'W1', 'd4' FROM DUAL UNION ALL
SELECT 'W2', 'd2' FROM DUAL UNION ALL
SELECT 'W2', 'd3' FROM DUAL;

输出:

WORKFLOW_ID 标题
W1 d1
d5
d4
W2 d2
d3

db<> 在这里摆弄

这在这里有效,希望它可以帮助......

WITH
    tbl AS
        (
            Select 'w1' "WORKFLOW_NO", 'd1' "DISCIPLINE" From Dual UNION ALL
            Select 'w1' "WORKFLOW_NO", 'd5' "DISCIPLINE" From Dual UNION ALL
            Select 'w1' "WORKFLOW_NO", 'd4' "DISCIPLINE" From Dual UNION ALL
            Select 'w2' "WORKFLOW_NO", 'd2' "DISCIPLINE" From Dual UNION ALL
            Select 'w2' "WORKFLOW_NO", 'd3' "DISCIPLINE" From Dual
        )
SELECT
    SUBSTR(LISTAGG(' ' || Chr(10) || WORKFLOW_NO) WITHIN GROUP (ORDER BY WF), 3, 50)  "WORKFLOW_NO",
    LISTAGG(DISCIPLINE, Chr(10)) WITHIN GROUP (ORDER BY WF) "DISCIPLINE"
FROM
    (
        SELECT
            c.WORKFLOW_NO "WF",
            c.CNT "CNT",
            CASE 
              WHEN Count(1) OVER(PARTITION BY t.WORKFLOW_NO ORDER BY t.WORKFLOW_NO ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) = c.CNT 
              THEN t.WORKFLOW_NO 
            ELSE '' 
            END "WORKFLOW_NO",
            t.DISCIPLINE "DISCIPLINE"
        FROM
            tbl t
        INNER JOIN
            (
                SELECT DISTINCT
                  WORKFLOW_NO "WORKFLOW_NO",
                  Count(WORKFLOW_NO) OVER(PARTITION BY WORKFLOW_NO ORDER BY WORKFLOW_NO) "CNT"
                FROM
                  tbl
            ) c ON(c.WORKFLOW_NO = t.WORKFLOW_NO)
    )
GROUP BY
    WF, CNT
--
--  R e s u l t
--  WORKFLOW_NO   DISCIPLINE    
--  ------------  ----------    
--                d1     
--                d4      
--  w1            d5 
--  -----------------------------------------
--                d2    
--  w2            d3     

暂无
暂无

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

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