联接表上文本的SQL聚合
请原谅我缺乏正确的术语,我是一名专业的软件工程师,通常处理Direct3D框架。我自学数据库 我有一张联接表上文本的SQL聚合,sql,sql-server,group-by,aggregate,Sql,Sql Server,Group By,Aggregate,请原谅我缺乏正确的术语,我是一名专业的软件工程师,通常处理Direct3D框架。我自学数据库 我有一张\u People表和一张\u ethnicies表。由于人们可能有不止一个文化群体,我有一个链接表\u linkPersonEthnicity。样本数据如下所示: 我想要的是以下形式的输出: 为了说明这个问题,我提出了以下(可运行的)查询: 它返回该人员的ID,即为该人员的种族找到的ID的总和,并用逗号连接最大值Name。数据分组正确,SumOfIDs有效,证明使用了正确的数据 当然,我想
\u People
表和一张\u ethnicies
表。由于人们可能有不止一个文化群体,我有一个链接表\u linkPersonEthnicity
。样本数据如下所示:
我想要的是以下形式的输出:为了说明这个问题,我提出了以下(可运行的)查询: 它返回该人员的ID,即为该人员的种族找到的ID的总和,并用逗号连接最大值
Name
。数据分组正确,SumOfIDs有效,证明使用了正确的数据
当然,我想删除Max
聚合函数,但无法删除,因为它不在groupby
列表中
有没有办法让这一切顺利进行
提前感谢,
上午
(非常感谢StackOverflow上的其他答案让我走了这么远!尤其是@Jonathan Leffler和@Marc_s。) 我还尝试了@Chris Shaffer的一篇文章中的
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
并添加groupby
,则无法访问文本字段Name
。如果我理解正确,则需要将连接
放在子查询中,而不是外部查询中
select lPE.Person, Sum(lpe.ethnicity) as SumOfIDs,
Ethnicity = stuff((select ', ' + E.Name as [text()]
from _linkPersonEthnicity lPE2 join
_Ethnicities e
on lpe2.Ethnicity = e.id
where lpe2.Person = lPE.Person
for xml path('')
), 1, 2, '')
from _linkPersonEthnicity lPE
group by lPE.Person;
顺便问一下,您真的想要ID的总和还是计数?子查询中不需要聚合。你试过把它拿走吗?另外,请参阅和。@AaronBertrand-离题问题:我在哪里可以找到你写的所有文章的列表。如果可能,给我一个链接。提前谢谢。@Fireblade我不认为有这样的事情存在。我写了几乎所有的常见问题。我在和上有博客档案。我已经为你写了76条建议,并且在其他地方散布了各种帖子,比如。@AaronBertrand-谢谢你,先生。将在这些网站中搜索。我找到了这个。@AndrewMalcolm,看起来你不小心创建了两个帐户。如果您使用用于询问此问题的帐户登录,则可以编辑此帖子,而无需将其推到审阅队列中。还有。。。。我不知道为什么或者打字错误是什么,但是我得到了
无法绑定多部分标识符“e.ID”。
我还知道为什么删除了这个答案的注释?我之前已经打过一次了,@GordonLinoff确实回复了。(遗憾的是,我无法用前面的回答来解决这个问题。)@AndrewMalcolm。对于join
条件,原始查询具有lPE.identiality=E.ID
。这在子查询中具有相同的条件。如果原始查询中的联接公式正确,它应该可以工作。对不起,我忘记更改包含E.ID
的SumOfIDs表达式。(反正我要把它扔掉了,所以我没看它。)为打嗝道歉,非常感谢你的解决方案。(作为补充,我很早就尝试过这种方法,但显然已经塞满了。啊,好吧。)顺便说一句,SumOfIDs被放在那里只是为了测试我是否能得到正确的数据。
select lPE.Person, Sum(lpe.ethnicity) as SumOfIDs,
Ethnicity = stuff((select ', ' + E.Name as [text()]
from _linkPersonEthnicity lPE2 join
_Ethnicities e
on lpe2.Ethnicity = e.id
where lpe2.Person = lPE.Person
for xml path('')
), 1, 2, '')
from _linkPersonEthnicity lPE
group by lPE.Person;