[英]Concatenate multiple rows into single rows and count the concatenated rows in 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.