【问题标题】:SQL Aggregation of text on joined table连接表上文本的 SQL 聚合
【发布时间】: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

【问题讨论】:

标签: sql sql-server group-by aggregate


【解决方案1】:

如果我理解正确,您需要将 join 放在子查询中而不是外部查询中

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 的总和还是计数?

【讨论】:

  • 不知道为什么或错字是什么,但我得到The multi-part identifier "e.ID" could not be bound. 另外我为什么要删除这个答案的 cmets?我之前输入过一次,@GordonLinoff 确实回复了。 (遗憾的是,我无法用之前的回复来解决它。)
  • @AndrewMalcolm 。 . .对于 join 条件,您的原始查询具有 lPE.Ethnicity = E.ID。这在子查询中具有相同的条件。如果原始查询中的连接公式正确,它应该可以工作。
  • 抱歉,我忘记更改包含E.ID 的 SumOfIDs 表达式。 (我没有看,因为无论如何我都会把它扔掉。)道歉打嗝,非常感谢你的解决方案! . . . (作为附录,我很早就尝试过这种方法,但显然被塞满了。嗯。)
  • 顺便说一句,SumOfIDs 被放在那里只是为了测试我是否得到了正确的数据。
猜你喜欢
  • 2014-11-18
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 2011-12-15
  • 2021-12-11
  • 2023-02-03
相关资源
最近更新 更多