簡體   English   中英

SQL 按子句查詢分組

[英]SQL Query Group by Clause

我遇到了SQL查詢的問題。 這是我的表結構:

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,而我想以第一列中的1,2和第二列中的3,4之類的方式顯示 Ids Address ,即 Ids 應按 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 對於您的示例數據,沒有必要。

是一個 db<>fiddle。

在 SQL 服務器的更新版本中,您只需使用string_agg() - 這樣您就可以忘記這個 XML hack。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM