#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