Sql 对于空值和分组,STUFF不能很好地工作
我有下面的模式和数据表 创建表[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个 以下是预期结果: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
| 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