在SQL Query中使用Average函数和JOIN函数

时间:2014-06-05 10:21:29

标签: sql sql-server join average

我正在使用SQL Server 2012而我无法弄清楚如何实现从特定表中的列中提取AVERAGE的代码。如果有人能帮助指出我所附的代码有什么问题,我会感激不尽。

正如您所看到的,我正在加入来自不同表的列以获得我期望的输出。 AVERAGE部分令我头疼!该专栏名为" RoomRate" (我需要按照ReservationID分组的金额的平均值)和我需要的表格被称为" ReservationStayDate"。

感谢您的帮助!

USE MY_DATABASE
SELECT a.ReservationStayID,
       a.FirstName + ' ' + a.LastName AS 'Name',
       b.PropertyCode AS'Property',
       b.ReservationStatus,
       b.MarketSegmentCode,
       a.ArrivalDate,
       a.DepartureDate,
       c.AdultCount,
       c.ChildCount,
       b.GuestCount,
       c.TaProfileID,
       c.PMSConfirmationNumber,
       c.CurrencyCode,
       d.rsl_nationality,
       d.rsl_country AS 'Cty of   Residence',
       d.rsl_totalroomrate,
       e.Name AS 'Tour Operator',
       e.CountryCode AS 'Market',
       f.[RateAmount]
FROM GuestNameInfo a
JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID
JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID
JOIN
  (SELECT avg(RateAmount) AS 'RateAmount'
   FROM ReservationStayDate
   GROUP BY ReservationStayID) ReservationStayDate f ON f.ReservationStayID = a.ReservationStayID

3 个答案:

答案 0 :(得分:0)

您需要将ReservationStayID放在子选择选择列表中。

如果是一个整数列,也将RateAmount与1.0相乘。

答案 1 :(得分:0)

你的sql看起来应该是这样的

USE MY_DATABASE

SELECT a.ReservationStayID,
       a.FirstName + ' ' + a.LastName AS 'Name',
       b.PropertyCode AS'Property',
       b.ReservationStatus,
       b.MarketSegmentCode,
       a.ArrivalDate,
       a.DepartureDate,
       c.AdultCount,
       c.ChildCount,
       b.GuestCount,
       c.TaProfileID,
       c.PMSConfirmationNumber,
       c.CurrencyCode,
       d.rsl_nationality,
       d.rsl_country AS 'Cty of   Residence',
       d.rsl_totalroomrate,
       e.Name AS 'Tour Operator',
       e.CountryCode AS 'Market',
       f.[RateAmount],

 (SELECT avg(RateAmount)
   FROM ReservationStayDate f
   where f.ReservationStayID = a.ReservationStayID ) as RateAmount

FROM GuestNameInfo a
     JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
     JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
     JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID
     JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID

答案 2 :(得分:0)

使用OVER子句,因为它比使用子查询派生聚合值更有效。

USE MY_DATABASE
SELECT a.ReservationStayID,
       a.FirstName + ' ' + a.LastName AS 'Name',
       b.PropertyCode AS'Property',
       b.ReservationStatus,
       b.MarketSegmentCode,
       a.ArrivalDate,
       a.DepartureDate,
       c.AdultCount,
       c.ChildCount,
       b.GuestCount,
       c.TaProfileID,
       c.PMSConfirmationNumber,
       c.CurrencyCode,
       d.rsl_nationality,
       d.rsl_country AS 'Cty of   Residence',
       d.rsl_totalroomrate,
       e.Name AS 'Tour Operator',
       e.CountryCode AS 'Market',
       --Aggregate function with Over clause
       AVG(f.RateAmount) OVER(PARTITION BY a.ReservationStayID) AS RateAmount
FROM GuestNameInfo a
JOIN GuestStaySummary b ON a.ReservationStayID = b.ReservationStayID
JOIN ReservationStay c ON c.ReservationStayID = b.ReservationStayID
JOIN P5RESERVATIONLIST d ON d.rsl_code = b.ReservationStayID
JOIN TravelAgency e ON e.TravelAgencyID = c.TAProfileID
JOIN ReservationStayDate f ON f.ReservationStayID = a.ReservationStayID