[英]SQL Server STRING_AGG and group by for column in one table but not for a column in another table
标题可能没有很好地描述问题。
我正在使用Microsoft Pubs数据库。 目标是显示所有标题及其作者姓名和出版商。 所以,我想出了这个:
select dt.title, STRING_AGG(CONCAT(da.au_fname, ' ', da.au_lname), ', ') as 'author name', dp.pub_name
from dbo.titles dt
left join dbo.titleauthor dta on dta.title_id = dt.title_id
left join dbo.authors da on da.au_id = dta.au_id
left join dbo.publishers dp on dp.pub_id = dt.pub_id
group by dt.title;
然后很快意识到它不起作用,因为虽然da.au_fname
和da.au_lname
通过dp.pub_name
与dt
相关联,但dta
直接与dt
相关联。 每个标题只有一个发布者,所以必须有一个解决方案,对吧?
谢谢你。
如果我理解正确,只需将pub_name
添加到group by
即可:
select dt.title,
STRING_AGG(CONCAT(da.au_fname, ' ', da.au_lname), ', ') as authors,
dp.pub_name
from dbo.titles dt left join
dbo.titleauthor dta
on dta.title_id = dt.title_id left join
dbo.authors da
on da.au_id = dta.au_id left join
dbo.publishers dp
on dp.pub_id = dt.pub_id
group by dt.title, dp.pub_name;
或者,您可以group by
并在 select 中使用聚合select
:
select dt.title,
STRING_AGG(CONCAT(da.au_fname, ' ', da.au_lname), ', ') as authors,
max(dp.pub_name)
如果每个标题只有一个出版商,那么也只需按出版商分组。 换句话说,如果从书名到出版商的关系就书名而言是单一的(一个出版商可能有很多书名,但一个书名只有一个出版商)那么说GROUP BY publisher, title
就像说GROUP BY title
一样有分歧
出版商 ABC 有 3 本书,“猫”、“狗”和“猪”
SELECT title, GROUP BY title
Cats
Dogs
Pigs
将发布者添加到两者都没有改变:
SELECT publisher, title GROUP BY publisher, title
ABC, Cats
ABC, Dogs
ABC, Pigs
仍然有3条记录..
如果你把作者也放在那里,每本书都是由两个人创作的:
SELECT publisher, title, author
ABC, Cats, John
ABC, Cats, Jane
ABC, Dogs, Tim
ABC, Dogs, Terence
ABC, Pigs, Emma
ABC, Pigs, Sam
但是然后你按 pub/title 分组并聚合作者:
SELECT publisher, title, AGG(author) GROUP BY publisher, title
ABC, Cats, "John,Jane"
ABC, Dogs, "Tim,Terence"
ABC, Pigs, "Emma,Sam"
然后你又回到了 3 行(出版商和标题的不同值),并且以前在它们自己的行上/导致 pub+title 数据重复的聚合值在一行上
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.