Левое внешнее соединение, исключающее 2 строки вместо вставки NULL - PullRequest
0 голосов
/ 30 марта 2020

Если время отсутствует, я хочу, чтобы значение NULL в этой строке / столбце не отображалось вообще. Я использовал левое внешнее объединение несколько раз раньше и у меня не было проблем.

Если я начну с таблицы с 4 статусами:

SELECT Status FROM flight;
Status
OUT
OFF
ON
IN

Пока все хорошо. Теперь я хочу оставить внешнее объединение таблицы со всеми данными

SELECT [Status], [time] FROM flight
left outer join FlightTime on (FlightTime.StatusId=flight.FlightTimeStatusId)
Status   Time
OUT      2020-03-10 19:23:00.000
IN       2020-03-10 22:15:00.000

Желаемый результат:

Status   Time
OUT      2020-03-10 19:23:00.000
OFF      NULL
ON       NULL
IN       2020-03-10 22:15:00.000

Образец данных OOOI

Flight OUT                      OFF                     ON                      IN
0001   2020-02-07 15:15:00.000  2020-02-07 15:53:00.000 2020-02-07 20:17:00.000 2020-02-07 20:20:00.000
0002   2020-02-14 16:19:00.000  2020-02-14 16:29:00.000 2020-02-14 21:06:00.000 2020-02-14 21:08:00.000

Не волнуйтесь о столбцах вместо строк. Я выясню, как это сделать позже. Этот пример данных взят из более раннего запроса, который работает нормально (и предоставляет данные столбца по желанию), пока отсутствуют данные. Проблема (как видно здесь) в том, что данные отсутствуют.

1 Ответ

0 голосов
/ 31 марта 2020

Вы можете сделать это, используя PIVOT. В вашем случае, когда вы PIVOT к фиксированным столбцам, если нет данных, он должен вернуть NULL.

Проверьте эту страницу для получения справки по PIVOT: Эффективное преобразование строк в столбцы на sql сервере

Select * from (
Your query that returns all the data including the [Time] column here
)  f
PIVOT
( 
    max([Time]) for Status in ([OUT], [OFF], [ON], [IN])
) piv;

...