SQL SERVER Select Distinct ID не работает

#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