繁体   English   中英

SQL 服务器 STRING_AGG 和分组依据用于一个表中的列而不是另一个表中的列

[英]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_fnameda.au_lname通过dp.pub_namedt相关联,但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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM