【发布时间】:2023-04-09 16:57:01
【问题描述】:
请原谅缺乏正确的术语,我是一名专业的软件工程师,通常处理 Direct3D 框架。我是自学数据库的。
我有一个_People 表和一个_Ethnicities 表。由于人们可能有多个文化群体,我有一个链接表_linkPersonEthnicity。示例数据如下:
我想要的是输出如下形式:
为了说明问题,我提出以下(可运行的)查询:
select lPE.Person, Sum(E.ID) as SumOfIDs,
Ethnicity = stuff(
(select ', ' + Max(E.Name) as [text()]
from _linkPersonEthnicity xPE
where xPE.Person = lPE.Person
for xml path('')
),
1, 2, '')
from _Ethnicities E
join _linkPersonEthnicity lPE on lPE.Ethnicity = E.ID
group by lPE.Person
它返回人的 ID,即为该人的种族找到的 ID 的总和,并用逗号连接最大的 Name。数据分组正确,SumOfIDs 有效,证明使用了正确的数据。
我当然想带走Max 聚合函数,但不能因为它不在group by 列表中。
任何想法如何使这项工作?
提前致谢,
上午
(非常感谢 StackOverflow 上的其他答案让我走到了这一步!特别是 @Jonathan Leffler 的 explanation of the partitioning proceess 和 @Marc_s 的 illustrating a text concatenation technique。)
我还尝试了@Chris Shaffer 的answer to concatenating strings 中的coalesce
declare @Names VARCHAR(8000)
select @Names = COALESCE(@Names + ', ', '') + E.Name
from _Ethnicities E join _linkPersonEthnicity lPE on lPE.Ethnicity = E.ID
where lPE.Person = 1001;
select @Names
同样的问题。如果我删除where 并添加group by,则无法访问文本字段Name。
【问题讨论】:
-
子查询中不需要聚合。您是否尝试删除它?另请参阅this article 和this follow-up。
-
@AaronBertrand - 题外话:我在哪里可以找到您撰写的所有文章的列表。如果可能的话,分享我一个链接。提前致谢。
-
@Fireblade 我认为不存在这样的事情。我在aspfaq.com 上写了几乎所有常见问题解答。我在sqlblog.com、sqlperformance.com 和blogs.sqlsentry.com 有博客档案。我已经为mssqltips.com 写了 76 条提示,并且有各种帖子分散在其他地方,例如our family blog。
-
@AaronBertrand - 谢谢先生。会在这些网站上搜索。我找到了这个sqlperformance.com/author/abertrand。
-
@AndrewMalcolm,您好像不小心创建了两个帐户。如果您使用用于提出此问题的帐户登录,则可以编辑此帖子而无需将其推入审核队列。 stackoverflow.com/users/4946944/andrew-malcolm 和.... stackoverflow.com/users/4604363/andrew
标签: sql sql-server group-by aggregate