Как мне извлечь данные из основной таблицы на основе этого конкретного сценария c? - PullRequest
0 голосов
/ 29 мая 2020

Я использую SQL Server 2014. У меня есть таблица (T1), которая содержит список идентификаторов отмененных бронирований и их эквивалентных повторных бронирований.

Извлечение таблицы T1:

CancelledID       Re-bookingID
  301                754
  387                801
  400                900
  ...

Каждый CancelledID имеет уникальный эквивалент в столбце Re-bookingID.

У меня есть другая таблица (T2), которая содержит список ВСЕХ BookingID с дополнительной информацией, относящейся к каждому идентификатору. Отрывок из этой таблицы показан ниже:

BookingID     MonthOfStay      RoomNights
...
301             2019-03-01        10
387             2019-04-01         7
400             2019-03-01         5
754             2019-08-01        10
801             2019-09-01         3
900             2019-07-01         5
900             2019-08-01         4
...   

Мне нужен запрос t- sql, который выдаст следующий результат:

  BookingID       Cancelled_MonthOfStay     Re-booking_MonthOfStay     RoomNights
    301                2019-03-01                                           10
    387                2019-04-01                                            7
    400                2019-03-01                                            5
    754                                           2019-08-01                10
    801                                           2019-09-01                 3
    900                                           2019-07-01                 5
    900                                           2019-08-01                 4

Как видите, re -бронирование может охватывать более 2 месяцев с дополнительными ночами в номере. - правильный способ решения проблемы).

Примечание: конечная цель - использовать эти данные для построения матрицы с Cancelled_MonthOfStay в виде строк и Re-booking_MonthOfStay в качестве столбцов. Значение внутри этой матрицы будет общим количеством ночей в комнате.

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Похоже, самый простой способ - это развернуть данные в таблице «Cancellations», а затем использовать выражение CASE для отображения данных в соответствующем столбце:

USE Sandbox;
GO

CREATE TABLE dbo.Cancellations (CancelledID int, RebookingID int)
INSERT INTO dbo.Cancellations
VALUES (301,754),
       (387,801),
       (400,900);

GO

CREATE TABLE dbo.Bookings (BookingID int, MonthOfStay date, RoomNights int)
INSERT INTO dbo.Bookings
VALUES (301,'20190301',10),
       (387,'20190401', 7),
       (400,'20190301', 5),
       (754,'20190801',10),
       (801,'20190901', 3),
       (900,'20190701', 5),
       (900,'20190801', 4);
GO

SELECT B.BookingID,
       CASE V.BookingType WHEN 'Cancellation' THEN B.MonthOfStay END AS CancelledMonthOfStay,
       CASE V.BookingType WHEN 'Rebooking' THEN B.MonthOfStay END AS RebookedMonthOfStay,
       B.RoomNights
FROM dbo.Cancellations C
     CROSS APPLY (VALUES(C.CancelledID, 'Cancellation'),(C.RebookingID, 'Rebooking')) V(BookingID,BookingType)
     JOIN dbo.Bookings B ON V.BookingID = B.BookingID
ORDER BY B.BookingID;

GO

DROP TABLE dbo.Cancellations;
DROP TABLE dbo.Bookings;
0 голосов
/ 29 мая 2020

Вы можете дважды СЛЕВА ПРИСОЕДИНИТЬСЯ к таблице T1. Затем используйте CASE, чтобы оставить правые столбцы пустыми.

SELECT T2.bookingID,
    case when canc.CancelledID is not null then t2.monthOfSTay end as cancelled_MonthOfStay,
    case when reb.rebookingID is not null then t2.monthOfStay end as rebooking_MonthOfStay

FROM T2
LEFT JOIN T1 as canc
    on T2.bookingID = canc.CancelledID
LEFT JOIN T1 as reb
    on T2.bookingID = reb.rebookingID
...