SQL 按条款查询分组

SQL Query Group by Clause

我遇到了 SQL 查询的问题。这是我的 table 结构:

DECLARE @tab TABLE
             (
                   Id INT IDENTITY, 
                   Rid INT, 
                   Address1 VARCHAR(50),
                   City VARCHAR(20)
              ) 

INSERT INTO @tab VALUES (56, 'Test1', 'New York')
INSERT INTO @tab VALUES (1253, 'Test1', 'Delhi')
INSERT INTO @tab VALUES (56, 'Address5', 'Cali')
INSERT INTO @tab VALUES (1253, 'Address5', 'Delhi')

SELECT * FROM @tab

我的查询:

SELECT
    Address1, STUFF((SELECT ',' + CONVERT(Varchar, Id)
                     FROM @tab TR
                     WHERE TR.Rid IN (56, 1253)
                     GROUP BY Id, Rid, Address1 
                     FOR XML PATH('')), 1, 1, '') AS addid
FROM
    @tab T
WHERE 
    T.Rid IN (56,1253)
GROUP BY
    T.Address1

它以逗号方式显示所有 ID,而我想以 Address 方式显示 ID,例如第一列中的 1,2 和第二列中的 3,4,即 ID 应该按 Address1 分组。

谢谢

您需要过滤 TR.Address1 = T.Address1 而不是 TR.Rid IN (56, 1253)

SELECT
    Address1, STUFF((SELECT ',' + CONVERT(Varchar, Id)
                     FROM @tab TR
                     WHERE TR.Address1 = T.Address1 // Adjust the condition here
                     GROUP BY Id, Rid, Address1 
                     FOR XML PATH('')), 1, 1, '') AS addid
FROM
    @tab T
WHERE 
    T.Rid IN (56,1253)
GROUP BY
    T.Address1

Live demo here

您需要一个相关的子查询。我建议将查询写成:

SELECT Address1,
       STUFF((SELECT ',' + CONVERT(Varchar(MAX), Id)
              FROM tab TR
              WHERE TR.Address1 = T.Address1
              FOR XML PATH('')
             ), 1, 1, '') AS addid
FROM  tab T
WHERE T.Rid IN (56, 1253)
GROUP BY Address1

备注:

  • 子查询中不需要聚合。
  • 不要在 SQL 服务器中使用没有长度的 varchar。长度因上下文而异,它会引入难以调试的错误。
  • 关联子句根据地址将值与外部查询中的值联系起来。
  • 不清楚year是否真的需要在子查询中过滤T.Rid。对于您的示例数据,没有必要。

Here 是一个 db<>fiddle.

在 SQL 服务器的更新版本中,您只需使用 string_agg() -- 这样您就可以忘记这个 XML hack。