使用 case 语句将多行连接成一列

Posted

技术标签:

【中文标题】使用 case 语句将多行连接成一列【英文标题】:Concat multiple rows into a single coumn using case statement 【发布时间】:2018-12-18 05:02:24 【问题描述】:

我必须用分布在多行中的逗号分隔值连接一列。 根据行号,我必须连接文本列。 例如对于文本列中的 row_num 2 值应该是 AB,BC

输入

Name.   Date      Identifier     Text Row_num   Val
Charles 08/07/18 30565   AB    1       2
Charles 08/07/18     30565   BC    2       4
Charles 08/07/18     30565   CD    3       6
Charles 08/07/18     30565   EF    4   3
Charles 08/07/18     30565   FG    5.  4
Charles 08/07/18     30565   GH    6       5

所需的输出:

Name    Date    Identifier  Text              Row_num        Val
Charles 08/07/18      30565     AB                  1         2
Charles 08/07/18      30565     AB,BC               2         4
Charles 08/07/18      30565     AB,BC,CD                3         6
Charles 08/07/18      30565     AB,BC,CD,EF         4         3
Charles 08/07/18      30565     AB,BC,CD,EF,FG      5         4
Charles 08/07/18      30565     AB,BC,CD,EF,FG,GF   7         5

使用的查询:

SELECT 
    Name,
    Date,
    ,Identifier
    MAX(CASE WHEN Row_nnum = 1 THEN Text END)  ||
    MAX(CASE WHEN Row_nnum = 2  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 3  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 4  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 5  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 6  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 7  THEN ', ' || Text ELSE '' END)
    SUM(val)
FROM TABLE 
GROUP BY 1,2,3;

这个查询的问题是它在文本列中为 row_num 2,3,4,5,7 提供 Null 值。因此无法获得所需的输出

SELECT 
    Name,
    Date,
    ,Identifier
    MAX(CASE WHEN Row_nnum = 1 THEN Text END)  ||
    MAX(CASE WHEN Row_nnum = 2  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 3  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 4  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 5  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 6  THEN ', ' || Text ELSE '' END) ||
    MAX(CASE WHEN Row_nnum = 7  THEN ', ' || Text ELSE '' END),
    SUM(val)
FROM TABLE 
GROUP BY 1,2,3;

【问题讨论】:

请注意,OP 似乎无法使用 agg_concatenate。 【参考方案1】:

只需将该条件添加到CASE

SELECT Name, Date, Identifier,
       (MAX(CASE WHEN Row_nnum = 1 THEN Text END)  ||
        MAX(CASE WHEN Row_nnum = 2 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END) ||
        MAX(CASE WHEN Row_nnum = 3 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END) ||
        MAX(CASE WHEN Row_nnum = 4 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END) ||
        MAX(CASE WHEN Row_nnum = 5 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END) ||
        MAX(CASE WHEN Row_nnum = 6 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END) ||
        MAX(CASE WHEN Row_nnum = 7 AND Text IS NOT NULL THEN ', ' || Text ELSE '' END)
       ),
      SUM(val)
FROM TABLE 
GROUP BY 1, 2, 3;

【讨论】:

不,这无济于事。这给出了相同的结果,因为 for row_num case 语句将再次处理数据,而不是从派生列 (row_num=1) 获取数据。

以上是关于使用 case 语句将多行连接成一列的主要内容,如果未能解决你的问题,请参考以下文章

连接字符串,基于 Case 语句

如何找到每个页面的所有标签,然后将标签连接成一列?

BigQuery - 将多列连接成一列以获取大量列

POSTGRESQL:使用连接表的案例

将具有多行的一列旋转到一个连接的行

如何用sql语句将一列多行数据拼接逗号隔开形成一条记录