stuff不能很好地处理空值和分组

x3naxklr  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(368)

我有下面的模式和数据表。

  1. CREATE TABLE [dbo].[SearchTest]
  2. (
  3. [DocumentNumber] [int] NOT NULL,
  4. [AlphaNumeric] [nvarchar](50) NULL,
  5. [Integers] [int] NULL
  6. ) ON [PRIMARY]
  7. GO
  8. INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
  9. VALUES (1, N'abc', 1)
  10. INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
  11. VALUES (2, N'abc', 1)
  12. INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
  13. VALUES (3, N'bcd', 2)
  14. INSERT [dbo].[SearchTest] ([DocumentNumber], [AlphaNumeric], [Integers])
  15. VALUES (4, N'bcd', 2)
  16. GO

表格数据:

我想做分组使用 Alphanumeric 以及 Integers 列并获取 DocumentNumber 在我的最终结果中作为逗号分隔的值。
我的最终结果应该是这样的,

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

  1. SELECT *
  2. FROM
  3. (SELECT
  4. STUFF((SELECT ', ' + CAST(DocumentNumber AS VARCHAR(10)) [text()]
  5. FROM SearchTest
  6. WHERE AlphaNumeric = Result.Alphanumeric
  7. OR Integers = Result.Integers
  8. FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ' ') DocumentNumbers,
  9. COUNT(DocumentNumber) TotalDocuments,
  10. Result.AlphaNumeric,
  11. Result.Integers
  12. FROM
  13. (SELECT *
  14. FROM SearchTest
  15. WHERE AlphaNumeric LIKE '%b%' OR Integers = 1) AS Result
  16. GROUP BY
  17. Result.AlphaNumeric, Result.Integers) AS Final

但是,如果我在中有空值,上面的查询就会中断 Integers 列。
例如,如果我有 NULL “我的整数”列中的值,如下所示:

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

分组在上面的查询中工作正常,但是 STUFF 给予的部分 DocumentNumbers 给出错误的结果。在这种情况下,这是必须的 2 在第一排和 1 在第二排。
预期结果如下:

  1. | DocumentNumbers| TotalDocuments| AlphaNumeric | Integers |
  2. +----------------+---------------+---------------+---------------+
  3. | 2 | 1 | abc | NULL |
  4. | 1 | 1 | abc | 1 |
  5. | 3, 4 | 2 | bcd | 2 |

请帮助我找出哪里出了问题

hfwmuf9z

hfwmuf9z1#

你得换衣服 WHERE 内部查询的子句a)使用 AND 而不是 OR 以及b)检查 NULL 我也是。

  1. SELECT stuff((SELECT concat(', ', documentnumber)
  2. FROM searchtest st2
  3. WHERE (st2.alphanumeric = st1.alphanumeric
  4. OR st2.alphanumeric IS NULL
  5. AND st1.alphanumeric IS NULL)
  6. AND (st2.integers = st1.integers
  7. OR st2.integers IS NULL
  8. AND st1.integers IS NULL)
  9. FOR XML PATH('')),
  10. 1,
  11. 2,
  12. '') documentnumbers,
  13. count(*) totaldocuments,
  14. alphanumeric,
  15. integers
  16. FROM searchtest st1
  17. WHERE st1.alphanumeric LIKE '%b%'
  18. OR st1.integers = 1
  19. GROUP BY st1.alphanumeric,
  20. st1.integers;
展开查看全部
wqlqzqxt

wqlqzqxt2#

跟随@gordonlinoff对问题的评论。这可以通过使用 STRING_AGG() 如果你用的是 SQL Server 2017 以及以上。这也简化了查询。
查询:

  1. SELECT *
  2. FROM
  3. (SELECT
  4. STRING_AGG(Result.DocumentNumber, ', ') DocumentNumbers,
  5. COUNT(DocumentNumber) TotalDocuments,
  6. Result.AlphaNumeric,
  7. Result.Integers
  8. FROM
  9. (SELECT *
  10. FROM SearchTest
  11. WHERE AlphaNumeric LIKE '%b%' OR Integers = 1) AS Result
  12. GROUP BY
  13. Result.AlphaNumeric, Result.Integers) AS Final

预期产量:

展开查看全部
l3zydbqr

l3zydbqr3#

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

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

相关问题