2014-11-27 3 views
1

У меня есть следующий запрос:Как написать этот запрос SQL JOIN с несколькими условиями

SELECT a.ReservationStayID, 
    c.Createdon, 
    a.FirstName + ' ' + a.LastName AS 'Name', 
    b.PropertyCode AS'Property', 
    b.ReservationStatus AS 'Status', 
    d.rsl_rateplan AS 'Rate Plan Code', 
    d.rsl_mealplan, 
    d.rsl_roomtype, 
    b.MarketSegmentCode AS 'Market Segment', 
    e.TravelAgencyTypeCode AS 'Source of Business', 
    a.ArrivalDate AS 'Date of Arrival', 
    a.DepartureDate AS 'Date of Departure', 
    (SELECT DATEDIFF (day,ArrivalDate,DepartureDate) 
    FROM ReservationStay c 
    WHERE c.ReservationStayID = a.ReservationStayID) AS 'Nights', 
    c.AdultCount AS 'Adult', 
    c.ChildCount AS 'Child', 
    b.GuestCount AS 'Guest', 
    d.rsl_reasonstay, 
    c.TaProfileID,  
    c.PMSConfirmationNumber, 
    c.CurrencyCode As 'Currency', 
    d.rsl_nationality AS 'Nationality', 
    d.rsl_country AS 'Country of Residence', 
    d.rsl_totalroomrate, 
    e.Name AS 'Tour Operator', 
    e.CountryCode AS 'Market Code',  
    g.CountryGroup AS 'Market', 


(SELECT avg(RateAmount)/1.15 
    FROM ReservationStayDate f 
    where f.ReservationStayID = a.ReservationStayID) AS 'Rate Amount Excl.VAT', 

    c.TAProfileID2, 
    e2.Name AS 'Booking Origin (1)', 
    g2.CountryGroup AS 'Booking Origin (2)' 



FROM GuestNameInfo a 
JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID 
LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID 
LEFT JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID 
LEFT JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID 
LEFT JOIN Market g ON e.CountryCode = g.CountryCode 
LEFT JOIN TravelAgency e2 ON e2.TravelAgencyID = c.TAProfileID2 
LEFT JOIN Market g2 ON e2.CountryCode = g2.CountryCode 

LEFT JOIN 
(
    SELECT 
    ReservationStayID, 
    datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) as [MTH], 
    count(*) AS [Nights Spent], 
    avg(RateAmount) as [Rate], 
    min(CreatedOn) as CreatedOn, 
    min(StayDate) as [DateOfArrival], 
    max(StayDate) as [DateOfDeparture] 
    FROM ReservationStayDate 
    GROUP BY ReservationStayID, datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) 
    ) x ON x.ReservationStayID = b.ReservationStayID 

WHERE a.PrimaryGuest='+' and d.rsl_primaryguest='+' 

Мне нужно добавить РЕГИСТРИРУЙТЕСЬ заявление из таблицы под названием dbo.Budget, который будет тянуть значение от «PkgRevenue» и «GADR» и добавьте эти 2 значения в 2 новых столбца в выводе вышеуказанного запроса. Однако значения этих двух столбцов должны быть объединены на основе этих условий: PropertyCode, Month и Market должны совпадать.

dbo.Budget имеет следующую структуру:

PropertyCode Month   Market PkgRevenue  GADR 
    xxx   November 2014 UK   1,251,000  3,256 

ответ

0

Вы можете просто приложить этот запрос в подзапрос и присоединиться к нему с таблицей бюджета, как это:

SELECT 
    ... -- Here you can put whatever the columns you want to select 
FROM 
(
    -- your query here 
) AS t1 
INNER JOIN Budget AS b ON .... 

Или использовать КТР таким же образом, как это:

WITH CTE 
AS 
(
    -- your query here 
) 
SELECT 
    c.*, 
    b.PkgRevenue, 
    b.GADR 
FROM CTE AS c 
INNER JOIN dbo.Budget AS b ON c.PropertyCode = b.PropertyCode 
          AND c.Month  = b.Month 
          AND c.Market  = c.Market; 

следующим образом:

WITH CTE 
AS 
( 
    SELECT 
     a.ReservationStayID, 
     c.Createdon, 
     a.FirstName + ' ' + a.LastName AS 'Name', 
     b.PropertyCode AS'Property', 
     b.ReservationStatus AS 'Status', 
     d.rsl_rateplan AS 'Rate Plan Code', 
     d.rsl_mealplan, 
     d.rsl_roomtype, 
     b.MarketSegmentCode AS 'Market Segment', 
     e.TravelAgencyTypeCode AS 'Source of Business', 
     a.ArrivalDate AS 'Date of Arrival', 
     a.DepartureDate AS 'Date of Departure', 
     (SELECT DATEDIFF (day,ArrivalDate,DepartureDate) 
     FROM ReservationStay c 
     WHERE c.ReservationStayID = a.ReservationStayID) AS 'Nights', 
     c.AdultCount AS 'Adult', 
     c.ChildCount AS 'Child', 
     b.GuestCount AS 'Guest', 
     d.rsl_reasonstay, 
     c.TaProfileID,  
     c.PMSConfirmationNumber, 
     c.CurrencyCode As 'Currency', 
     d.rsl_nationality AS 'Nationality', 
     d.rsl_country AS 'Country of Residence', 
     d.rsl_totalroomrate, 
     e.Name AS 'Tour Operator', 
     e.CountryCode AS 'Market Code',  
     g.CountryGroup AS 'Market', 
     (SELECT avg(RateAmount)/1.15 
     FROM ReservationStayDate f 
     where f.ReservationStayID = a.ReservationStayID) AS 'Rate Amount Excl.VAT', 
     c.TAProfileID2, 
     e2.Name AS 'Booking Origin (1)', 
     g2.CountryGroup AS 'Booking Origin (2)', 
     x.MTH -- <======== You need to select the MTH column 
    FROM GuestNameInfo a 
    JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID 
    LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID 
    LEFT JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID 
    LEFT JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID 
    LEFT JOIN Market g ON e.CountryCode = g.CountryCode 
    LEFT JOIN TravelAgency e2 ON e2.TravelAgencyID = c.TAProfileID2 
    LEFT JOIN Market g2 ON e2.CountryCode = g2.CountryCode 
    LEFT JOIN 
    (
     SELECT 
     ReservationStayID, 
     datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) as [MTH], 
     count(*) AS [Nights Spent], 
     avg(RateAmount) as [Rate], 
     min(CreatedOn) as CreatedOn, 
     min(StayDate) as [DateOfArrival], 
     max(StayDate) as [DateOfDeparture] 
     FROM ReservationStayDate 
     GROUP BY ReservationStayID, datename(m,StayDate) + ' ' + cast(datepart(yyyy,StayDate) as varchar) 
     ) x ON x.ReservationStayID = b.ReservationStayID 

    WHERE a.PrimaryGuest='+' and d.rsl_primaryguest='+' 
) 
SELECT 
    c.*, 
    b.PkgRevenue, 
    b.GADR 
FROM CTE AS c 
INNER JOIN dbo.Budget AS b ON c.PropertyCode = b.PropertyCode 
          AND c.MTH   = b.Month   -- <=== Here you put MTH 
          AND c.Market  = c.Market 
+0

Спасибо, но мне нужен месяц в таблице бюджета, чтобы соответствовать месяцу, извлеченному из таблицы ReservationstayDate (т. Е. Эта строка в моем запросе: 'datename (m, StayDate) +' '+ cast (datepart (yyyy) , StayDate) как varchar) как [MTH] ' Кроме того, я не совсем понимаю первый вариант, который вы дали. ВЫБРАТЬ ... ОТ ( - ваш запрос здесь ) AS t1 INNER JOIN бюджета AS B ON .... Что я помещал между ВЫБРАТЬ и ОТ? – user3115933

+0

@ user3115933 - Затем вам нужно выбрать столбец «MTH», затем использовать его в состоянии соединения, например, что я сделал в редактировании. Для '....' вы можете поместить любые столбцы, которые вы хотите выбрать. См. Мой обновленный ответ. –

Смежные вопросы