有人能帮我解决GROUP BY问题吗



我有这个查询:

SELECT 
tc.dv_task,
tc.dv_ci_item,
STUFF((
SELECT ',' + lob.name
FROM u_cmdb_ci_line_of_business lob
where lob.sys_id = tc.ci_item
GROUP BY tc.dv_task
FOR XML PATH('') ), 1, 1, '') AS LOBs
FROM task_ci tc
INNER JOIN u_cmdb_ci_line_of_business lob on tc.ci_item = lob.sys_id

它返回以下错误:消息164,级别15,状态1,第8行每个GROUP BY表达式必须至少包含一个不是外部引用的列。

我使用的是Microsoft SQL Server 2016(SP2-GDR((KB4505220(-13.0.5101.9(X64(

以下是我想要实现的:我有两个表task_ci(tc(和u_cmdb_line_of_business(lob(。表通过tc.ci_item=lob.sys_id连接。对于tc表上的每个dv_task,我想要一行在逗号分隔的字段中列出lob表中的相关ci_items。这就是为什么我尝试按dv_task分组。

If I take out the group by, I get this:
tc.dv_task   LOBs (Stuff field)
123456       lob.ci_item 1 
123456       lob.ci_item 2

我想要这个:dv_task LOB(填充字段(123456 lob。ci_item1,lob.ci_item2

但当我通过添加该组时,试图将内容放在一行中,我会出现错误。希望这是有道理的。

有人能告诉我我做错了什么吗?

编辑:03/23

好吧,我明白了,我只是把它改成了像这样的子字符串

select 
inc.number,
substring((select ', ' + lob.name from task_ci tc 
join u_cmdb_ci_line_of_business lob on lob.sys_id = tc.ci_item 
where inc.sys_id = tc.task
for XML PATH('')),2,1000) as lob_sysid                
from incident inc
where inc.number = 'INC1157655'

我仍然不确定我在STUF上做错了什么,但我会在不同的表上尝试一下,看看它是如何工作的。

谢谢你的帮助。

我认为您不需要外部查询中的JOIN

SELECT tc.dv_task, tc.dv_ci_item,
STUFF((SELECT ',' + lob.name
FROM u_cmdb_ci_line_of_business lob
WHERE lob.sys_id = tc.ci_item
FOR XML PATH('')
), 1, 1, '') AS LOBs
FROM task_ci tc;

好吧,我明白了,我只是把它改成了像这样的子字符串

select 
inc.number,
substring((select ', ' + lob.name from task_ci tc 
join u_cmdb_ci_line_of_business lob on lob.sys_id = tc.ci_item 
where inc.sys_id = tc.task
for XML PATH('')),2,1000) as lob_sysid                
from incident inc
where inc.number = 'INC1157655'

我仍然不确定我在STUF上做错了什么,但我会在不同的表上尝试一下,看看它是如何工作的。

谢谢你的帮助。

最新更新