переключить регистр из подзапроса sql - PullRequest
0 голосов
/ 08 мая 2020

Предположим, что у меня есть 6 таблиц: Users, Customers, Providers (каждый пользователь должен быть или клиентом, или поставщиком), Requests, Offers, Booking.

Каждый клиент может опубликовать sh новый запрос, и каждый провайдер может сделать предложение для любого запроса, если клиент хочет, он может сделать заказ для одного из предложений (каждый запрос может иметь не более одного бронирования).

Я хочу создать запрос, который показывает для каждого запроса его статус, если есть нет предложения для этого запроса, покажите «Ожидание предложения», если есть хотя бы один запрос для этого запроса, но нет бронирования, покажите «Ожидание бронирования», и если для этого запроса есть бронирование, показывающее «закрыто».

Сначала я попробовал:

SELECT 
    R.RequestID, O.OfferID, B.OfferID,
    CASE 
       WHEN O.OfferID IS NULL THEN 'Waiting for offer'
       WHEN O.OfferID IS NOT NULL AND B.OfferID IS NULL THEN 'Waiting for booking'
       WHEN B.OfferID IS NOT NULL THEN 'Closed'
    END AS Status
FROM
    Requests AS R 
LEFT JOIN 
    Offers AS O ON O.RequestID = R.RequestID 
LEFT JOIN 
    Bookings AS B ON B.OfferID = O.OfferID

Результаты:

это результаты этого запроса, я добавил столбцы offerID и BookingID, чтобы сделать его более понятным

Но, конечно, это явно не работает, потому что он возвращает бронирование и все предложения для каждого запроса, а для каждого предложения свое шоу «Ожидание бронирования» или «Закрыто».

Для этот экзамен Пожалуйста, вывод для requestID '300' Должен появиться только один раз со статусом 'closed'.

Я знаю, что мне нужно использовать в подзапросе для каждого запроса и проверять, есть ли предложения, и если да, проверьте, есть ли бронирование для этого запроса, но я не могу найти способ проверить эти проверки в подзапросе, есть ли способ или, возможно, переключить регистр или еще для этого?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Прикрепленное решение, основанное на решении jpock76.

    SELECT 
        R.RequestID, O.OfferID, B.OfferID, 'Waiting for offer' as 'status'
    FROM
        Requests AS R 
    LEFT JOIN 
        Offers AS O ON O.RequestID = R.RequestID 
    LEFT JOIN 
        Bookings AS B ON B.OfferID = O.OfferID
    where R.requestid in (
        select R.requestid from requests R
        LEFT JOIN 
            Offers AS O ON O.RequestID = R.RequestID 
        LEFT JOIN 
            Bookings AS B ON B.OfferID = O.OfferID
        where O.OfferID IS NULL
        )  -- where request is not getting any offer
UNION 
    SELECT 
        R.RequestID, O.OfferID, B.OfferID, 'Waiting for Booking' as 'status'
    FROM
        Requests AS R 
    LEFT JOIN 
        Offers AS O ON O.RequestID = R.RequestID 
    LEFT JOIN 
        Bookings AS B ON B.OfferID = O.OfferID
    where O.OfferID IS NOT NULL AND R.requestid NOT IN (
        SELECT R.RequestID
        FROM Requests AS R 
        LEFT JOIN 
            Offers AS O ON O.RequestID = R.RequestID 
        LEFT JOIN 
            Bookings AS B ON B.OfferID = O.OfferID
        WHERE B.OfferID IS NOT NULL)  -- where there offer but not booking
UNION
    (SELECT 
        R.RequestID, O.OfferID, B.OfferID, 'Closed' AS 'Status'
    FROM
        Requests AS R 
    LEFT JOIN 
        Offers AS O ON O.RequestID = R.RequestID 
    LEFT JOIN 
        Bookings AS B ON B.OfferID = O.OfferID
    WHERE B.OfferID IS NOT NULL) -- where request is closed only
ORDER BY R.requestid
0 голосов
/ 08 мая 2020

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

SELECT 
    R.RequestID, O.OfferID, B.OfferID,
    CASE 
       WHEN O.OfferID IS NULL THEN 'Waiting for offer'
       WHEN O.OfferID IS NOT NULL AND B.OfferID IS NULL THEN 'Waiting for booking'
       WHEN B.OfferID IS NOT NULL THEN 'Closed'
    END AS Status
FROM
    Requests AS R 
LEFT JOIN 
    Offers AS O ON O.RequestID = R.RequestID 
LEFT JOIN 
    Bookings AS B ON B.OfferID = O.OfferID
where B.OfferID IS NOT NULL -- where request is closed only
UNION 
SELECT 
    R.RequestID, O.OfferID, B.OfferID,
    CASE 
       WHEN O.OfferID IS NULL THEN 'Waiting for offer'
       WHEN O.OfferID IS NOT NULL AND B.OfferID IS NULL THEN 'Waiting for booking'
       WHEN B.OfferID IS NOT NULL THEN 'Closed'
    END AS Status
FROM
    Requests AS R 
LEFT JOIN 
    Offers AS O ON O.RequestID = R.RequestID 
LEFT JOIN 
    Bookings AS B ON B.OfferID = O.OfferID
where R.requestid not in (

select requestid from requests R
LEFT JOIN 
    Offers AS O ON O.RequestID = R.RequestID 
LEFT JOIN 
    Bookings AS B ON B.OfferID = O.OfferID
where B.OfferID IS NULL

)  -- where request is not closed only
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...