Может кто-нибудь помочь мне с проблемой GROUP BY? - PullRequest
0 голосов
/ 21 марта 2020

У меня есть этот запрос:

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)

Вот что я пытаюсь выполнить sh: У меня есть две таблицы task_ci (t c) и u_cmdb_line_of_business (lob). Таблицы объединяются по t c .ci_item = lob.sys_id. Для каждой задачи dv_task в таблице t c мне нужна одна строка, в которой в поле через запятую перечисляются связанные ci_items из таблицы lob. Вот почему я пытаюсь сгруппировать по 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 LOBs (Stuff field) 123456 lob. ci_item 1, lob.ci_item 2

Но когда я добавляю эту группу в качестве попытки собрать вещи в один ряд, я получаю эту ошибку. Надеюсь, что это имеет смысл.

Может кто-нибудь сказать мне, что я делаю неправильно?

РЕДАКТИРОВАТЬ: 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'

Я до сих пор не уверен, что я делал неправильно с STUFF, но я попробую это с другой таблицей, чтобы посмотреть, как это работает.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Хорошо, я понял, я просто изменил его на подстроку вот так

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'

Я до сих пор не уверен, что я делал не так с STUFF, но попробую с другим Таблица, чтобы увидеть, как это работает.

Спасибо за помощь.

0 голосов
/ 21 марта 2020

Я не думаю, что вам нужно 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;
...