Sql 使用case语句将多行合并到一个列中
我必须用逗号分隔的值连接一列,这些值分布在多行中。 根据行号,我必须对文本列进行编码。 例如,对于第2行,文本列中的值应为AB、BCSql 使用case语句将多行合并到一个列中,sql,concatenation,case,group-concat,vertica,Sql,Concatenation,Case,Group Concat,Vertica,我必须用逗号分隔的值连接一列,这些值分布在多行中。 根据行号,我必须对文本列进行编码。 例如,对于第2行,文本列中的值应为AB、BC Name Date Identifier Text Row_num Val Charles 08/07/18 30565 AB 1 2 Charles 08/07/18 30565 AB,BC 2
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
输入
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
所需输出:
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
使用的查询:
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;
此查询的问题是,它在第2、3、4、5、7行的文本列中提供空值。因此无法获得所需的输出
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;
只需将该条件添加到
案例中
:
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 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;
请注意,OP似乎无法使用agg_concatenate.No,这不会有帮助。这给出了相同的结果,因为for row_num case语句将再次处理数据,而不是从派生列(row_num=1)获取数据。