#sql #sql-server #distinct #for-xml-path #select-for-xml
#sql #sql-сервер #distinct #for-xml-path #select-for-xml
Вопрос:
Я пытаюсь добраться до этого оператора sql Select ниже, но я не могу понять это правильно.
Select DISTINCT vc.cid, vt.tid, vc.device,
STUFF((select ', ' c.tName from thumbTbl t2
join tags v ON t2.cid = v.cid
join config c on v.tid = c.tid
where vc.cid = t2.cid
group by c.tName
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)'), 1, 1, '') tName
from tags vt
Inner join thumbTbl vc on vt.cid = vc.cid
Left join config vtc on vt.tid = vtc.tid
order by vc.cid asc
Результат выглядит следующим образом:
cid tid device tName
--- --- --------- ---------
159 7 Mat Dwens Escalation, Follow Up, More Benefits
159 11 Mat Dwens Escalation, Follow Up, More Benefits
159 12 Mat Dwens Escalation, Follow Up, More Benefits
160 7 Jeniffer P Rectro
162 8 Marc Novice More Benefits, Rectro
162 6 Marc Novice More Benefits, Rectro
165 4 Jeniffer P Follow up
Вопрос: Как отобразить только 1 строку каждого выбранного идентификатора?, Я пытался использовать SELECT DISTINCT
, но все равно дал мне тот же результат и выше.
Результат, который я хочу видеть, должен быть таким, как показано ниже:
cid tid device tName
------- --------- ----------
159 12 Mat Dwens Escalation, Follow Up, More Benefits
160 7 Jeniffer P Rectro
162 8 Marc Novice More Benefits, Rectro
165 4 Jeniffer P Follow up
У кого-нибудь есть идея?
Комментарии:
1. Пожалуйста, предоставьте образцы данных и желаемые результаты.
2. @GordonLinoff просто добавьте образец данных, спасибо
Ответ №1:
Это не DISTINCT
то, что вам нужно, это GROUP BY
совокупная функция tid
. Результаты таковы DISTINCT
, что у вас есть разное значение для tid
каждой строки, однако то, что вы хотите, — это MAX
. Из-за отсутствия выборочных данных это непроверено, однако я думаю, что это правильно:
SELECT vc.cid,
MAX(vt.tid) AS tid,
vc.device,
STUFF((SELECT ', ' c.tName
FROM thumbTbl t2
JOIN tags v ON t2.cid = v.cid
JOIN config c ON v.tid = c.tid
WHERE vc.cid = t2.cid
GROUP BY c.tName
FOR XML PATH(''), TYPE).value('(./text())[1]', 'nvarchar(max)'),1,2,'') AS tName --Changed to use .text() and also removed leading space
FROM tags vt
INNER JOIN thumbTbl vc ON vt.cid = vc.cid
LEFT JOIN config vtc ON vt.tid = vtc.tid
GROUP BY vc.cid,
vc.device
ORDER BY vc.cid ASC;
Комментарии:
1. сделал свое дело, это вытащило его, просто я не хотел использовать функцию
Max()
и.GroupBy
у вас нет другого способа, кромеGroupBy
запроса?2. Без выборочных данных я бы не хотел рисковать предположениями, @PatsonLeaner . Однако сейчас это уже другой вопрос, и его следует опубликовать как новый.
3. Однако я привел примеры данных по этому вопросу выше. может ли это быть вам полезно в полной мере?
4. В вопросе нет выборочных данных, @PatsonLeaner, только результаты; нежелательные результаты и ожидаемые результаты. Но это не меняет моего комментария; если вы хотите спросить о том, как подойти к проблеме по-другому, это другой вопрос, и вам следует задать новый. Изменение вопроса на это приведет к аннулированию моих ответов и ответов Гордона и будет отменено пользователями или может легко привести к тому, что вопрос привлечет отрицательные голоса. Изменение вопроса на недействительные существующие ответы вызывает неодобрение сообщества.
Ответ №2:
Удалите SELECT DISTINCT
и присоединитесь к config
во внешнем запросе. Затем исправьте внутренний запрос, чтобы он приносил только то, что вы хотите от config
:
select vc.cid, vt.tid, vc.device,
stuff((select ', ' c.tName
from config c on v.tid = c.tid
where v.tid = c.tid
for xml path(''), TYPE
).value('.', 'NVARCHAR(max)'
), 1, 1, ''
) tNames
from tags vt join
thumbTbl vc
on vt.cid = vc.cid
group by vc.cid, vt.tid, vc.device
order by vc.cid asc
Комментарии:
1.присоедините теги v К t2.cid = v.cid это место, где я объявляю v. Теперь в вашем коде выше v не инициируется. должен ли я сохранить его? также
from
иon
Incorrect Syntax
в разделе stuff