使用 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 语句将多行连接成一列的主要内容,如果未能解决你的问题,请参考以下文章