Sql 将多行合并为一行

Sql 将多行合并为一行,sql,function,db2,self-join,coalesce,Sql,Function,Db2,Self Join,Coalesce,当项目id匹配时,我尝试将多个跨行名称合并到一列中。我从一个self-join开始,但无法让它以我想要的方式工作,我非常确定有一个函数或cte可以更轻松地完成这项工作。询问方向。使用db2 这是我到目前为止所做的,它不起作用,并且产生了一个-104错误 ( SELECT DP.D_P_ID, DP.project_name, DU2.NAME_LAST CONCAT ', '

当项目id匹配时,我尝试将多个跨行名称合并到一列中。我从一个self-join开始,但无法让它以我想要的方式工作,我非常确定有一个函数或cte可以更轻松地完成这项工作。询问方向。使用db2

这是我到目前为止所做的,它不起作用,并且产生了一个-104错误

  (

        SELECT 
                        DP.D_P_ID, DP.project_name,
                        DU2.NAME_LAST CONCAT ', ' CONCAT DU2.NAME_FIRST AS 
                        FROM Fact_table as FAT 
                        INNER JOIN D_P DP ON FAT.D_P_ID = DP.D_P_ID
                        INNER JOIN B_U_P BUP on DP.D_P = BUP.D_P_ID
                        INNER JOIN D_U DU2 ON BUP.D_U_ID = DU2.D_U_ID
                        INNER JOIN D_Date DD ON FAT.START_DATE_ID = DD.DATE_KEY
                        INNER JOIN D_A DA ON FAT.D_A_ID = DA.D_A_ID
                        WHERE  ((    (DD.DATE_VALUE >= '2013-01-01')
                                OR (DD.DATE_VALUE < '2014-01-01')
                                OR (DD.DATE_VALUE <= '2013-01-01')))
                                AND DA.M_NAME = 'Mandy'
                                AND BUP.USER_FLAG = 'Y'

                        GROUP BY  DP.D_P_ID, DP.project_name, DU2.NAME_LAST CONCAT ', ' CONCAT DU2.NAME_FIRST
                        ORDER BY DP.project_name 
             )  PI1      

                 join 

                        (
                                SELECT 
                        DP.D_P_ID, DP.project_name,
                        DU2.NAME_LAST CONCAT ', ' CONCAT DU2.NAME_FIRST AS 
                        FROM Fact_table as FAT 
                        INNER JOIN D_P DP ON FAT.D_P_ID = DP.D_P_ID
                        INNER JOIN B_U_P BUP on DP.D_P = BUP.D_P_ID
                        INNER JOIN D_U DU2 ON BUP.D_U_ID = DU2.D_U_ID
                        INNER JOIN D_Date DD ON FAT.START_DATE_ID = DD.DATE_KEY
                        INNER JOIN D_A DA ON FAT.D_A_ID = DA.D_A_ID
                        WHERE  ((    (DD.DATE_VALUE >= '2013-01-01')
                                OR (DD.DATE_VALUE < '2014-01-01')
                                OR (DD.DATE_VALUE <= '2013-01-01')))
                                AND DA.M_NAME = 'Mandy'
                                AND BUP.USER_FLAG = 'Y'

                        GROUP BY  DP.D_P_ID, DP.project_name, DU2.NAME_LAST CONCAT ', ' CONCAT DU2.NAME_FIRST
                        ORDER BY DP.project_name 
                        ) PI2 on PI1.d_p_id = PI2.d_p_id 
数据示例:

这是我需要的结果:

在外部选择中,使用类似

select d_p_id, project_name, listagg(admin, ',')
from (...)
group by d_p_id, project_name

在DB29.7及更高版本中提供的listagg函数使用指定的分隔符通过在组内串联聚合。

您的DB2版本和平台是什么?我使用的是版本号为9070500DBVisualizer的DbVisualizer,它是用于查询数据的工具,而不是存储信息的DB2数据库。数据库服务器运行的是什么版本的DB2,以及什么操作系统?这些信息可以帮助我们为您的环境提供最佳答案。