Наружный Применить объединить 2 строки в 1 строку и 2 столбца

Я пытаюсь написать запрос, который объединяет несколько результатов объединения Outer Apply в одну строку данных. Я играл с некоторыми CTE, но я просто не могу обернуться вокруг решения.

Я хотел бы, чтобы результаты множественного объединения отображались в виде 1 строки, а результаты 2-го соединения отображались во 2-м столбце.

SELECT 
     E.[EventId]
    ,S_ID.[EventType]
    ,null as [RootCause2]

 FROM [AOE_Workflow].[dbo].[Event] E

    outer apply
    (
    select * from [AOE_Workflow].[dbo].[EventTypes] S
    WHERE E.EventID=S.EventID
    ) S

    outer apply
    (
    select * from [AOE_Workflow].[dbo].[EventType] S_ID
    WHERE S_ID.[EventTypeId]=S.[EventTypeId]
    ) S_ID

ORDER BY eventID desc

2 ответа

Решение

Если я не ошибаюсь, ваш outer applys можно указать проще с помощью простого LEFT JOINs.

Параллельный вывод может быть сделан с PIVOT, В данном запросе нет неявного порядка сортировки. Это означает, что оно будет случайным, то есть первым, а вторым (и третьим / четвертым). В моем SQL вы можете легко управлять сортировкой при изменении (SELECT NULL) к чему-то подходящему.

SELECT p.*
FROM
(
    SELECT 
         E.[EventId]
        ,S_ID.[EventType]
        ,'EventType_' + CAST(ROW_NUMBER() OVER(PARTITION BY E.[EventId] ORDER BY(SELECT NULL)) AS VARCHAR(1)) AS ColumnName
    FROM [AOE_Workflow].[dbo].[Event] E
    LEFT JOIN [AOE_Workflow].[dbo].[EventTypes] S ON E.EventID=S.EventID
    LEFT JOIN [AOE_Workflow].[dbo].[EventType] S_ID ON S_ID.[EventTypeId]=S.[EventTypeId]
) AS tbl
PIVOT
(
    MIN(EventType) FOR ColumName IN(EventType_1,EventType_2,EventType_3,EventType_4)
) AS p

Вы все еще находитесь на этапе проектирования или ограничены существующей структурой данных?

Кажется, что каждый тип события является своей собственной сущностью, как и основная причина, т.е. EventType = "Нет питания" может иметь "истекший срок службы батареи" или "плохой генератор переменного тока" в качестве основных причин, поэтому вы должны присоединить основную причину к событию, а не тип события.

CREATE TABLE Event
( eventId int NOT NULL,
  eventTypeId int not null,
  rootCauseId int not null,
  CONSTRAINT e_pk PRIMARY KEY (eventId)
);

CREATE TABLE EventType
( eventTypeId int NOT NULL,
  eventTypeDescription int not null,
  CONSTRAINT et_pk PRIMARY KEY (eventTypeId)
);

CREATE TABLE EventRootCause
( rootCauseId int NOT NULL,
  rootCauseDescription int not null,
  CONSTRAINT rc_pk PRIMARY KEY (rootCauseId)
);

select
     e.eventId
    ,et.EventTypeDescription as EventType
    ,rc.rootCauseDescription as RootCause2
from
    Event e 
left join
    EventType et
        on
            e.eventTypeId = et.EventTypeId
left join
    RootCause rc
        on
            e.rootCauseId = rc.RootCauseId
order by e.eventId
Другие вопросы по тегам