Результат SQL в виде списка

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я пытаюсь создать sql, который будет возвращать клиентов для определенного счета-фактуры в виде списка.

Чтобы лучше объяснить себя, я приложил диаграмму того, чего я пытаюсь достичь.

введите описание изображения здесь

КАК вы можете видеть из результата SQL, я бы хотел, чтобы SQL отображал клиентов в виде списка для каждого invoices.number

Как бы я выполнил SQL (для SQL SERVER)?

Комментарии:

1. У вас довольно хороший дизайн базы данных, но меня озадачивает, почему вы хотите получить результирующий набор со значениями, разделенными запятыми. Это почти никогда не бывает хорошей идеей.

2. @Shark, это кажется довольно стандартным требованием. Почему вы говорите, что это плохая идея? Я бы согласился, что это плохая идея, если бы он хранил эту информацию в своей базе данных, но если ему нужно выбрать свои данные в этом формате на основе бизнес-требований, что это повредит?

3. Да, это бизнес-требование для целей презентации.

4. @Yannick, да, это довольно распространенный запрос при представлении данных. Я не могу придумать ни одной причины, по которой это не было бы хорошей идеей.

5. Если это для представления, общие принципы проектирования заключаются в том, что вы должны обрабатывать нормализованные результаты в вашем клиенте и обрабатывать строки для представления в вашем уровне представления…

Ответ №1:

 declare @Invoices table(ID int, Number varchar(10))
declare @Customers table(ID int, Name varchar(20))
declare @InvoiceCustomers table(InvoiceID int, CustomerID int)

insert into @Invoices values (1, 'INV01')
insert into @Customers values (1, 'NAME1'),(2, 'NAME2'),(3, 'NAME3')
insert into @InvoiceCustomers values (1, 1),(1, 2),(1, 3)

select I.Number as InvoicesNumber,
       stuff((select ', ' C.Name
              from @Customers as C
                inner join @InvoiceCustomers as IC
                  on C.ID = IC.CustomerID
              where IC.InvoiceID = I.ID
              for xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') as CustomersName
from @Invoices as I