Sql 对于空值和分组,STUFF不能很好地工作

Sql 对于空值和分组,STUFF不能很好地工作,sql,sql-server,Sql,Sql Server,我有下面的模式和数据表 创建表[dbo]。[SearchTest] [DocumentNumber][int]不为空, [字母数字][nvarchar]50空, [整数][int]空 在[小学] 去 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值1,N'abc',1 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值2,N'abc',1 插入[dbo]。[SearchTest][Documen

我有下面的模式和数据表

创建表[dbo]。[SearchTest] [DocumentNumber][int]不为空, [字母数字][nvarchar]50空, [整数][int]空 在[小学] 去 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值1,N'abc',1 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值2,N'abc',1 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值3,N'bcd',2 插入[dbo]。[SearchTest][DocumentNumber],[字母数字],[整数] 值4,N'bcd',2 去 表数据:

我想使用字母数字和整数列进行分组,并在最终结果中以逗号分隔的值获取DocumentNumber

我的最终结果应该是这样的

下面是我的查询,它给出了上述输出

挑选* 从…起 选择 填充选择“,”+CASTDocumentNumber作为VARCHAR10[文本] 来自搜索测试 其中字母数字=结果。字母数字 或整数=结果。整数 对于XML路径,键入.value'.',NVARCHARMAX',1,2',DocumentNumber, COUNTDocumentNumber TotalDocuments, 结果。字母数字, 结果:整数 从…起 选择* 来自搜索测试 其中字母数字(如“%b%”)或整数=1作为结果 分组 Result.AlphaNumeric,Result.integer作为最终值 但是,如果整数列中有空值,则上述查询将中断

例如,如果我的整数列中有空值,如下所示:

现在我的查询中断了,我在我的stuff查询中得到了错误的结果,如下所示

在上面的查询中,分组工作正常,但给出DocumentNumber的STUFF部分给出了错误的结果。在这种情况下,第一行中有2个,第二行中有1个

以下是预期结果:

| DocumentNumbers| TotalDocuments| AlphaNumeric  | Integers      |
+----------------+---------------+---------------+---------------+
| 2              | 1             | abc           | NULL          |
| 1              | 1             | abc           | 1             |
| 3, 4           | 2             | bcd           | 2             |
请在我出错的地方提供帮助

您需要将内部查询的where子句更改为use,而不是OR和b来检查空值


我现在已经编辑了代码:

您可以使用以下代码来实现此目的:

SELECT S.DocumentNumbers,COUNT(S.DocumentNumbers) AS TotalDocuments,S.AlphaNumeric,S.Integers FROM
(SELECT COALESCE(Stuff((SELECT ', ' + CAST(DocumentNumber AS VARCHAR(10)) 
        FROM SearchTest T1
        WHERE T1.AlphaNumeric=T2.AlphaNumeric AND T1.Integers=T2.Integers
        FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ')
        ,CAST (T2.DocumentNumber AS VARCHAR(20))) AS DocumentNumbers,T2.AlphaNumeric,T2.Integers
FROM SearchTest T2) S
GROUP BY DocumentNumbers,S.AlphaNumeric,S.Integers
ORDER BY S.Integers

以下是问题中的@GordonLinoff评论。如果您使用的是SQL Server 2017及更高版本,则可以使用STRING_AGG轻松实现这一点。这也简化了查询

查询:

挑选* 从…起 选择 字符串_accessult.DocumentNumber,,'DocumentNumber, COUNTDocumentNumber TotalDocuments, 结果。字母数字, 结果:整数 从…起 选择* 来自搜索测试 其中字母数字(如“%b%”)或整数=1作为结果 分组 Result.AlphaNumeric,Result.integer作为最终值 预期产出:


这根本不是什么问题。NULL+{any value}=NULL。如果有空值,则通过在WHERE ColumnName NOT NULL中省略它们或用ISNULL/COALESCE替换空值来处理它们。或者不使用连接运算符+使用CONCAT,如果任何表达式的值为NULL,CONCAT不会返回NULL。编辑您的问题并显示您想要的结果。另外,我建议创建一个DB/SQL FIDLE。并解释为什么不使用string_agg。@GordonLinoff我已经添加了预期的结果。我不知道string_agg。[string_agg]是在SQL Server 2017中引入的,@fingers10。我已经编辑了代码。你现在可以检查了吗?@fingers10你检查了吗-@手指10
SELECT S.DocumentNumbers,COUNT(S.DocumentNumbers) AS TotalDocuments,S.AlphaNumeric,S.Integers FROM
(SELECT COALESCE(Stuff((SELECT ', ' + CAST(DocumentNumber AS VARCHAR(10)) 
        FROM SearchTest T1
        WHERE T1.AlphaNumeric=T2.AlphaNumeric AND T1.Integers=T2.Integers
        FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ')
        ,CAST (T2.DocumentNumber AS VARCHAR(20))) AS DocumentNumbers,T2.AlphaNumeric,T2.Integers
FROM SearchTest T2) S
GROUP BY DocumentNumbers,S.AlphaNumeric,S.Integers
ORDER BY S.Integers