Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
联接表上文本的SQL聚合_Sql_Sql Server_Group By_Aggregate - Fatal编程技术网

联接表上文本的SQL聚合

联接表上文本的SQL聚合,sql,sql-server,group-by,aggregate,Sql,Sql Server,Group By,Aggregate,请原谅我缺乏正确的术语,我是一名专业的软件工程师,通常处理Direct3D框架。我自学数据库 我有一张\u People表和一张\u ethnicies表。由于人们可能有不止一个文化群体,我有一个链接表\u linkPersonEthnicity。样本数据如下所示: 我想要的是以下形式的输出: 为了说明这个问题,我提出了以下(可运行的)查询: 它返回该人员的ID,即为该人员的种族找到的ID的总和,并用逗号连接最大值Name。数据分组正确,SumOfIDs有效,证明使用了正确的数据 当然,我想

请原谅我缺乏正确的术语,我是一名专业的软件工程师,通常处理Direct3D框架。我自学数据库

我有一张
\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;