我有下面的模式和数据表。
CREATE TABLE [dbo].[SearchTest]
(
[DocumentNumber] [int] NOT NULL,
[AlphaNumeric] [nvarchar](50) NULL,
[Integers] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
VALUES (1, N'abc', 1)
INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
VALUES (2, N'abc', 1)
INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
VALUES (3, N'bcd', 2)
INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
VALUES (4, N'bcd', 2)
GO
表格数据:
我想做分组使用 Alphanumeric
以及 Integers
列并获取 DocumentNumber
在我的最终结果中作为逗号分隔的值。
我的最终结果应该是这样的,
这是我的查询,它给出了上面的输出,
SELECT *
FROM
(SELECT
STUFF((SELECT ', ' + CAST(DocumentNumber AS VARCHAR(10)) [text()]
FROM SearchTest
WHERE AlphaNumeric = Result.Alphanumeric
OR Integers = Result.Integers
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') DocumentNumbers,
COUNT(DocumentNumber) TotalDocuments,
Result.AlphaNumeric,
Result.Integers
FROM
(SELECT *
FROM SearchTest
WHERE AlphaNumeric LIKE '%b%' OR Integers = 1) AS Result
GROUP BY
Result.AlphaNumeric, Result.Integers) AS Final
但是,如果我在中有空值,上面的查询就会中断 Integers
列。
例如,如果我有 NULL
“我的整数”列中的值,如下所示:
现在我的查询中断了,我在stuff查询中得到了错误的结果,如下所示
分组在上面的查询中工作正常,但是 STUFF
给予的部分 DocumentNumbers
给出错误的结果。在这种情况下,这是必须的 2
在第一排和 1
在第二排。
预期结果如下:
| DocumentNumbers| TotalDocuments| AlphaNumeric | Integers |
+----------------+---------------+---------------+---------------+
| 2 | 1 | abc | NULL |
| 1 | 1 | abc | 1 |
| 3, 4 | 2 | bcd | 2 |
请帮助我找出哪里出了问题
3条答案
按热度按时间hfwmuf9z1#
你得换衣服
WHERE
内部查询的子句a)使用AND
而不是OR
以及b)检查NULL
我也是。wqlqzqxt2#
跟随@gordonlinoff对问题的评论。这可以通过使用
STRING_AGG()
如果你用的是SQL Server 2017
以及以上。这也简化了查询。查询:
预期产量:

l3zydbqr3#
我现在编辑了代码:
您可以使用以下代码来实现这一点: