Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用case语句将多行合并到一个列中_Sql_Concatenation_Case_Group Concat_Vertica - Fatal编程技术网

Sql 使用case语句将多行合并到一个列中

Sql 使用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

我必须用逗号分隔的值连接一列,这些值分布在多行中。 根据行号,我必须对文本列进行编码。 例如,对于第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         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)获取数据。