簡體   English   中英

如何在SQL Server中從多個行進行連接,然后進行分組和計數

[英]How to concatenate from multiple rows, then group and count, in SQL Server

我試圖從中得到

tPeople
名稱
愛麗絲
短發

tAnimals
名字動物
愛麗絲貓
愛麗絲貓
鮑勃·馬
鮑勃·狗

對此

愛麗絲“貓* 2”
鮑勃·“馬,狗”

到目前為止,我有一個中間表來對動物進行分組和計數

t分組名稱動物理貨
愛麗絲貓2
鮑勃狗1
鮑勃·馬1

如果我跑步

SELECT Name, Animals=STUFF((
    SELECT N', '+animal+'*'+tally FROM tgrouped as g
    WHERE g.Name = p.Name
    FOR XML PATH(''), TYPE).value(N'.[1]', N'varchar(max)'), 1, 2, N'')
FROM tpeople as p

我懂了
命名動物
愛麗絲貓* 2
鮑勃狗* 1,馬* 1

有什么辦法可以跳過中間表? 還有什么不顯示1的提示?

您不需要中間表。 您可以只在查詢中進行計算。 對於第二個,您可以調整邏輯:

WITH grouped as (
      SELECT a.name, a.animal, COUNT(*) as cnt
      FROM tAnimals a
      GROUP BY a.name, a.animal
     )
SELECT Name,
       STUFF((SELECT (CASE WHEN cnt = 1 THEN N', ' + animal
                           ELSE CONCAT(N', ', animal, '*',  cnt)
                      END)
              FROM grouped g
              WHERE p.Name = g.Name
              FOR XML PATH(''), TYPE
             ).value(N'.[1]', N'varchar(max)'
                    ), 1, 2, N''
            ) as animals
FROM tpeople p;

與戈登類似的方法,但沒有CTE:

CREATE TABLE dbo.tPeople ([Name] nvarchar(10));
CREATE TABLE dbo.tAnimal ([Name] nvarchar(10),
                          Animal varchar(10));

INSERT INTO  dbo.tPeople ([Name])
VALUES('Alice'),('Bob');

INSERT INTO dbo.tAnimal ([Name],
                         Animal)
VALUES('Alice','Cat'),
      ('Alice','Cat'),
      ('Bob', 'Dog'),
      ('Bob', 'Horse');

GO

SELECT P.[Name] + ' "' +
       STUFF((SELECT ', ' + CONCAT(A.Animal, '*' + CONVERT(varchar(3),NULLIF(COUNT(A.Animal),1)))
              FROM dbo.tAnimal A
              WHERE A.[Name] = P.[Name]
              GROUP BY A.Animal
              FOR XML PATH(''),TYPE).value('.','varchar(MAX)'),1,2,'') + '"'
FROM dbo.tPeople P;



GO
DROP TABLE dbo.tPeople;
DROP TABLE dbo.tAnimal;

暫無
暫無

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

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