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
您需要一个相关的子查询。我建议将查询写成:
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。
我遇到了 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
您需要一个相关的子查询。我建议将查询写成:
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。