Выделите все строки в таблице, разделенные запятыми с условием

#sql-server

#sql-сервер

Вопрос:

Клиент вводит заявку и выбирает отдел или, в некоторых случаях, несколько отделов из списка. Мое приложение возвращает отделы, разделенные запятой для каждого идентификатора билета. Это отлично работает. Однако пользователь, возможно, выбрал «ВСЕ» отделы из выборки (DEPARTMENT_ID для выбора ALL равен ‘1’). Затем мне нужно будет вернуть каждый отдел в таблицу Departments, разделенную запятыми.

 Ticket Table
    TICKET_ID   |  ISSUE
-------------------------
       100      | Power Outage
       101      | Internet is not working
  

Таблица нехватки:

  DEPARTMENT_ID | DEPARTMENT
 --------------------------
         1    | ALL
         2    | Accounting
         3    | Human Resources
         4    | Receiving
  

Таблица DepartmentTickets

 DEPARTMENT_TICKETS_ID | TICKET_ID | DEPARTMENT_ID
----------------------------------------------------------
       1              |    100    |     2
       2              |    100    |     3
       3              |    101    |     1
  

Используя мой запрос, билет 100 показывает следующие результаты:
Отключение питания: бухгалтерия, человеческие ресурсы
Как я могу заставить тикет 101 отображать следующее:
Интернет не работает: Все, Бухгалтерия, Отдел кадров, Прием

     Select ISSUE, 
    stuff((
    SELECT ', '   cast(Departments.DEPARTMENT as varchar(max))
    FROM Departments
    left join DepartmentTickets
    ON DepartmentTicket.TICKET_ID = TICKETS.TICKET_ID
    WHERE DepartmentTickets.TICKET_ID = TICKETS.TICKET_ID and DepartmentTickets.DEPARTMENT_ID = Departments.DEPARTMENT_ID       
    FOR XML PATH('')
    ), 1, 2, '') AS DEPARTMENTS
    FROM TICKETS
    WHERE TICKET_ID = '100'
    ORDER BY ISSUE
  

Ответ №1:

Сначала сделайте ваше внутреннее соединение замаскированным под правильное внутреннее соединение. В ON предложении затем добавьте с OR проверкой на наличие идентификатора отдела 1 .

И, кстати, если идентификаторы являются целыми числами, а не строками, которыми они кажутся, вам не следует заключать литералы в одинарные кавычки.

 SELECT t.issue, 
       stuff((SELECT ', '   cast(d.department AS varchar(max))
                     FROM departments d
                          INNER JOIN departmenttickets dt
                                     ON dt.department_id = d.department_id
                                         OR dt.department_id = 1
                     WHERE dt.ticket_id = t.ticket_id
                     FOR XML PATH('')),
             1,
             2,
             '') departments
       FROM tickets t
       WHERE t.ticket_id = 101
       ORDER BY t.issue;
  

db<>скрипта