首页 > 解决方案 > SQL Server STRING_AGG 和 group by 用于一个表中的列,但不用于另一个表中的列

问题描述

标题可能无法很好地描述问题。

我正在使用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;

然后很快意识到它不会起作用,因为 whileda.au_fnameda.au_lnamedtthrough相关联dta,直接dp.pub_name与相关联。每个标题只有一个出版商,所以必须有一个解决方案,对吧?dt

谢谢你。

标签: sqlsql-server

解决方案


如果我理解正确,只需添加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 dt.title,
       STRING_AGG(CONCAT(da.au_fname, ' ', da.au_lname), ', ') as authors,
       max(dp.pub_name)

推荐阅读