首页 > 解决方案 > 分组依据不包含数据时按列表显示数据

问题描述

我有一个这样的sql命令

select mainPOID.EstAPDate,mainPOID.POID,TTm.ID,TTMAmount=TTMD.InvoiceAmount
From TTBeforeMms TTM
inner join  TTBeforeMms_Detail TTMD   on TTM.ID = TTMD.ID
inner join (
select  distinct main.EstAPDate,main_D.POID
From AP main
left join  AP_Detail  main_D on main.ID = main_D.ID
where  main.Type ='PA' and  main.EstAPDate between '2018/6/01' AND '2018/6/15' and  left(main_D.InvoiceNo,4) != '1111' ) mainPOID on TTMD.poid =mainPOID.POID and TTM.EstAPdate<=mainPOID.EstAPdate and  mainPOID.POID='CM3PU18030009'
order by mainPOID.EstAPDate,mainPOID.POID

sql结果会像这样

在此处输入图像描述

我的问题是当分组依据不包含数据时,数据如何按列表显示?

例如

ID 将按列表显示当我按 EstAPDate、POID 和 sum(TTMAmount) 分组时

在此处输入图像描述

标签: sqlsql-servergroup-by

解决方案


有很多使用 FOR XML PATH 的 CSV 示例。对于您的情况,我将您现有的查询包装在 CTE 中,然后从那里生成 ID 的 CSV 字符串

; with 
cte as
(
select      mainPOID.EstAPDate, mainPOID.POID, TTm.ID, TTMAmount=TTMD.InvoiceAmount
From        TTBeforeMms TTM
inner join  TTBeforeMms_Detail TTMD   on TTM.ID = TTMD.ID
inner join  (
                select  distinct main.EstAPDate,main_D.POID
                From    AP main
                     left join  AP_Detail  main_D on main.ID = main_D.ID
                 where  main.Type ='PA' 
                 and    main.EstAPDate between '2018/6/01' AND '2018/6/15' 
                 and    left(main_D.InvoiceNo,4) != '1111' 
            ) mainPOID  on TTMD.poid      = mainPOID.POID 
                       and TTM.EstAPdate <= mainPOID.EstAPdate 
                       and mainPOID.POID  = 'CM3PU18030009'
)
SELECT  EstAPDate, POID, 
        ID = STUFF(c.ID, 1, 1, ''),
        TTMAmount = SUM(TTMAmount)
FROM    cte 
        CROSS APPLY
        (
            SELECT ',' + ID
            FROM   cte x
            WHERE  x.EstAPDate = cte.EstAPDate
            AND    x.POID      = cte.POID
            FOR XML PATH ('')
        ) c (ID)
GROUP BY EstAPDate, POID
ORDER BY EstAPDate, POID

推荐阅读