SQL Server中具有逗号分隔值的多个groupby

Nil*_*are 0 sql sql-server sql-server-2008

我有下面的表结构,如下所示

Budhol    COCODE    BEN      OBJ    SPARE2  SPARE1  TASKNO  Value   Field   Code
---------------------------------------------------------------------------------
362103    36        362101  991003  NULL    MA1001  NULL    4516    613030  001
362104    36        362104  991003  NULL    MA1001  NULL    9088    613030  002
362103    36        362101  991003  NULL    MA1001  NULL    3387    613030  003
362103    36        362101  991003  NULL    MA1001  NULL    4026    613030  004
Run Code Online (Sandbox Code Playgroud)

这是必需的输出

Budhol  COCODE  BEN      OBJ    SPARE2  SPARE1  TASKNO  Value   Field   Code
---------------------------------------------------------------------------------
362103  36      362101  991003  NULL    MA1001  NULL    11929   613030  001,003,001
362104  36      362104  991003  NULL    MA1001  NULL    9088    613030  002
Run Code Online (Sandbox Code Playgroud)

即通过做我需要的所有值和逗号分隔代码的总和

我曾尝试过以下查询但输出不匹配我获取所有列的所有代码

SELECT 
    B.BEN, B.Budhol, B.COCODE, B.FIELD, B.OBJ, B.SPARE1, B.SPARE2,    
    SUM(B.value) AS Value ,
    Code = STUFF((SELECT ', ' + Code 
                  FROM #temp2 b 
                  WHERE b.BEN = B.BEN 
                    AND b.Budhol = B.Budhol 
                    AND b.COCODE = B.COCODE 
                    AND b.FIELD = B.FIELD  
                    AND b.SPARE1 = B.SPARE1 
                    AND b.SPARE2 = B.SPARE2 
                  FOR XML PATH('')), 1, 1, '')
FROM 
    #temp2 B
GROUP BY 
    B.BEN, B.Budhol, B.COCODE, B.FIELD, B.OBJ, B.SPARE1, B.SPARE2;
Run Code Online (Sandbox Code Playgroud)

Tim*_*sen 5

问题似乎与NULL某些列中的值有关.特别是,SPARE1SPARE2列可以采用NULL值,您的意图是这些NULL值应该等同.在下面的查询中,我将它们包装在连接的两侧COALESCE,现在我得到了预期的输出.

SELECT B.BEN, B.Budhol, B.COCODE, B.FIELD, B.OBJ, B.SPARE1, B.SPARE2,    
    SUM(B.value) AS Value,
    Code = STUFF((SELECT ', ' + Code FROM temp2 t
                  WHERE t.BEN = B.BEN AND t.Budhol = B.Budhol AND t.COCODE = B.COCODE AND
                        t.FIELD = B.FIELD AND
                        COALESCE(t.SPARE1, '') = COALESCE(B.SPARE1, '') AND
                        COALESCE(t.SPARE2, '') = COALESCE(B.SPARE2, '')
                 FOR XML PATH('')), 1,1, '')
FROM temp2 B
GROUP BY B.BEN, B.Budhol, B.COCODE, B.FIELD, B.OBJ, B.SPARE1, B.SPARE2;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

演示