T-SQL Query, объединить столбцы из нескольких строк в один столбец - PullRequest
4 голосов
/ 09 января 2011

Я видел несколько примеров того, что я пытаюсь сделать, используя COALESCE и FOR XML (кажется, лучшее решение).Я просто не могу понять синтаксис правильно.

Вот что у меня есть (я сокращу поля только до ключевых):

Table                    Fields
------                   -------------------------------
Requisition              ID, Number
IssuedPO                 ID, Number
Job                      ID, Number
Job_Activity             ID, JobID (fkey)
RequisitionItems         ID, RequisitionID(fkey), IssuedPOID(fkey), Job_ActivityID (fkey)

Мне нужен запрос, который будетперечислите ОДНУ реквизицию в каждой строке с соответствующими заданиями и IssuedPO.(Номер заявки начинается с «R-», а номер задания начинается с «J-»).

Пример:

R-123 |"PO1; PO2; PO3" |"J-12345; J-6780"

Конечно, Адам!

Вот запрос, который возвращает несколько строк.Я должен использовать внешние объединения, так как не все Реквизиции имеют RequisitionItems, которые назначаются Заданиям и / или IssuedPO (в этом случае их идентификаторы fkey, разумеется, будут нулевыми).

SELECT DISTINCT Requisition.Number,  IssuedPO.Number, Job.Number
        FROM Requisition
        INNER JOIN RequisitionItem on RequisitionItem.RequisitionID = Requisition.ID
        LEFT OUTER JOIN Job_Activity on RequisitionItem.JobActivityID = Job_Activity.ID
        LEFT OUTER JOIN Job on Job_Activity.JobID = Job.ID
        LEFT OUTER JOIN IssuedPO on RequisitionItem.IssuedPOID = IssuedPO.ID

1 Ответ

4 голосов
/ 09 января 2011

Вот один из способов сделать это с помощью подзапросов:

select  'R-' + cast(r.number as varchar(32)) as RequisitionNumber
,       (
        select  'PO' + CAST(ip.number as varchar(32)) + ';'
        from    IssuedPO ip
        join    RequisitionItems ri
        on      ip.id = ri.IssuedPOID
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as POList
,       (
        select  'J-' + CAST(j.number as varchar(32)) + ';'
        from    Job j
        join    Job_Activity ja
        on      j.id = ja.JobID
        join    RequisitionItems ri
        on      ri.Job_ActivityID = ja.id
        where   ri.RequisitionID = r.id
        for xml path('')
        ) as JobList
from    Requisition r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...