2014-11-21 128 views
0

我正在使用SQL Server 2014,并且我有两个分别运行的查询,现在我需要连接这些查询,以便拥有一个输出。如何将这2个SQL查询合并为一个SQL查询

查询1立场如下:

USE MyDatabase 

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 


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

ORDER by a.ReservationStayID 

而第二个查询:

use MyDatabase 

select * 

FROM (SELECT 
    ReservationStayID,count(reservationstayid) AS [Nights Spent], 
    datename(m,StayDate)+' '+ cast(datepart(yyyy,StayDate) as varchar) as [MTH], 
    avg(RateAmount) as [Rate], 
    CreatedOn 

from ReservationStayDate 

GROUP BY ReservationStayID,STAYDATE,RATEAMOUNT,CreatedOn 

) AS S 

ORDER by ReservationstayID 

如果是这样的INNER JOIN,OUTER JOIN或一个完全不同的语法?

附加信息:

好,要更明确,这里有几个指针。 ReservationStayDate表列出按住宿日期保留的住宿人数(StayDate)。因此,如果客人在2014年10月31日至2014年11月4日之间逗留,ReservationStayDate表格每晚将显示4行(即:2014-10-31,2014-11-01,2014-11-02和2014-11-03)。

当我运行第一个查询时,我的输出对于每个来宾都是一行。现在,我需要为2个月以上(如上例所示)夜间出现的客人输出我的输出,其中添加的列名称为“MTH”(实际上显示月份和年份)和“已用夜间”。因此,输出将看起来像这样的客人谁花所有的夜晚在同一个月,并为那些谁超过2个月重叠:

ReservationStayId  CreatedOn........ DateOfArrival DateOfDeparture MTH  Nights 
    250         2014-09-05 2014-09-07 Sept 2014 2 
    285         2014-10-31 2014-11-04 Oct 2014  1 
    285         2014-10-31 2014-11-04 Nov 2014  3 

我希望我做了它一个更清晰一点了解。如果没有,请评论,我会添加更多的具体信息。

+2

表结构?预期结果?等等...更具体的你是在你的问题,你有更多的机会得到适当的帮助。 – bksi 2014-11-21 08:13:57

+0

创建SQL小提琴http://www.sqlfiddle.com/。 – 2014-11-21 08:17:33

+2

首先:您的第二个查询没有意义。您通过reservationstayid进行分组。所以'count(reservationstayid)'总是1,而不是“度过的夜晚”。而且,reservationstayid可能是桌子的关键。所以'avg(RateAmount)'总是一个记录的平均值,因此avg(RateAmount)= RateAmount。你的第一个查询是关于你的外连接的。你外连接'P5RESERVATIONLIST d',但是你的where子句中有'd.rsl_primaryguest ='+'',因此删除了任何外连接的记录(因为它的rsl_primaryguest将为null)。 – 2014-11-21 08:30:40

回答

0

您可以随时使用派生表。这是一个你加入的查询,就像你加入一个表一样。

SELECT 
    ... 
    x.[Nights Spent], 
    x.[MTH], 
    x.[Rate], 
    x.CreatedOn, 
    x.[DateOfArrival], 
    x.[DateOfDeparture] 
FROM GuestNameInfo a 
JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID 
LEFT JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID 
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 
... 

正如在评论你的要求已经提到的,你的第二个查询的就是没有意义 编辑:我已经按照您的要求修改改变了第二个查询。

如前所述,第一个查询是关于外部连接的中断。还有一个建议:使用可读的别名,而不是a,b,c,但可能是GuestNameInfo的gni,GuestStaySummary的gss等等。只要你想知道列所属的表是什么,就不必查找from/join子句。

+0

我编辑了我的问题,并提供了更多信息。谢谢。 – user3115933 2014-11-21 10:31:47

+0

好的,我已经编辑了我的答案,所以派生表查询现在应该做你想做的事情。等待。我将不得不作出另一项改变... – 2014-11-21 10:41:25

+0

完成。我不得不添加DateOfArrival和DateOfDeparture,你也希望在结果中看到它。 – 2014-11-21 10:48:43

-1

尝试这个希望进展....

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',-------change to g.CountryName to obtain Original Markets 
c.TAProfileID2, 
e2.Name AS 'Booking Origin (1)', 
g2.CountryGroup AS 'Booking Origin (2)' 

,s.*, 

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




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 
inner join 
    (SELECT 
    ReservationStayID,count(reservationstayid) AS [Nights Spent], 
    Convert(varchar,datename(m,StayDate)+' '+ cast(datepart(yyyy,StayDate)) as [MTH], 
    avg(RateAmount) as [Rate], 
    CreatedOn 

from ReservationStayDate 

GROUP BY ReservationStayID,STAYDATE,RATEAMOUNT,CreatedOn 

) AS S on s.ReservationStayID=a.ReservationStayID 

WHERE a.PrimaryGuest='+' and d.rsl_primaryguest='+' 
and f.ReservationStayID = a.ReservationStayID) AS 'Rate Amount Excl.VAT', 

ORDER by ReservationstayID 
+0

不起作用。我收到此消息: “Msg 156,Level 15,State 1,Line 44 关键字'from'附近的语法不正确 Msg 156,Level 15,State 1,Line 63 'AS'关键字附近的语法不正确。 “ – user3115933 2014-11-21 10:11:05

+0

删除逗号(,)后“AS'率金额Excl.VAT'”声明 – Dhaval 2014-11-21 10:25:52

+0

检查我编辑答案... – Dhaval 2014-11-21 10:26:42