Наружный Применить объединить 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 apply
s можно указать проще с помощью простого LEFT JOIN
s.
Параллельный вывод может быть сделан с 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