如何编写WHERE子句,其中一个条件是计算字段的结果?

时间:2014-07-07 10:12:35

标签: sql sql-server sql-server-2012 where-clause

我的查询中有一个计算字段,如下所示:

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

在同一个查询中,我需要排除RatePlan开头的所有数据' CO'以上结果= 0

换句话说,我的WHERE子句需要看起来像这样:

AND NOT (d.rateplan like 'CO%' and (avg(RateAmount)/1.15)= 0)

我收到以下错误消息:列名无效' RateAmount'

这里的语法有什么问题?

这是完整的查询:

SELECT a.ReservationStayID,
   b.PropertyCode AS'Property',
   b.ReservationStatus AS 'Status',
   d.rsl_rateplan AS 'Rate Plan Code',
   b.MarketSegmentCode AS 'Market Segment',
   e.TravelAgencyTypeCode AS 'Source of Business',
   a.ArrivalDate AS 'Date of Arrival',
   a.DepartureDate AS 'Date of Departure',
   c.AdultCount AS 'Adult',
   c.ChildCount AS 'Child',
   b.GuestCount AS 'Guest',
   d.rsl_nationality AS 'Nationality',
   c.PMSConfirmationNumber,
   c.CurrencyCode As 'Currency',
   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'

  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

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

  AND A.ARRIVALDATE <= '2013-09-30' AND A.DEPARTUREDATE > '2013-09-01'

  ORDER BY a.ReservationStayID

3 个答案:

答案 0 :(得分:1)

如果没有完整的查询,我无法给出确切的解决方案,但在SQL Server中,您可以使用APPLY,它将像子选择一样工作,但它将允许您重用已创建的列,并且还可以创建多列。 e.g。

SELECT  a.SomeField,
        r.RateAmountExcVat
FROM    SomeTable AS a
        INNER JOIN SomeOtherTable AS d
            ON d.SomeField = a.SomeField
        --... Whatever else your query does...
        OUTER APPLY
        (   SELECT  RateAmountExcVat = AVG(RateAmount)/1.15
            FROM    ReservationStayDate AS f
            WHERE   f.ReservationStayID = a.ReservationStayID
        ) AS r
WHERE   NOT (d.RatePlan LIKE 'CO%' AND r.RateAmountExcVat = 0);

但是,您不一定需要使用相关子查询,普通子查询的工作方式完全相同。因此,您可以将聚合移动到子查询,而不是在select子句中进行聚合,这意味着您可以在外部查询中引用聚合的结果。

SELECT  a.SomeField,
        r.RateAmountExcVat
FROM    SomeTable AS a
        INNER JOIN SomeOtherTable AS d
            ON d.SomeField = a.SomeField

        --... Whatever else your query does...

        LEFT JOIN 
        (   SELECT  ReservationStayID,
                    RateAmountExcVat = AVG(RateAmount)/1.15
            FROM    ReservationStayDate AS f
            GROUP BY ReservationStayID
        ) AS r
            ON r.ReservationStayID = a.ReservationStayID
WHERE   NOT (d.RatePlan LIKE 'CO%' AND r.RateAmountExcVat = 0);

修改

您的完整查询将是这样的。

SELECT  a.ReservationStayID,
        b.PropertyCode AS [Property],
        b.ReservationStatus AS [Status],
        d.rsl_rateplan AS [Rate Plan Code],
        b.MarketSegmentCode AS [Market Segment],
        e.TravelAgencyTypeCode AS [Source of Business],
        a.ArrivalDate AS [Date of Arrival],
        a.DepartureDate AS [Date of Departure],
        c.AdultCount AS [Adult],
        c.ChildCount AS [Child],
        b.GuestCount AS [Guest],
        d.rsl_nationality AS [Nationality],
        c.PMSConfirmationNumber,
        c.CurrencyCode As [Currency],
        e.Name AS [Tour Operator],
        e.CountryCode AS [Market Code],
        g.CountryGroup AS [Market],
        f.RateAmountExclVAT 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
        (   SELECT  ReservationStayID, 
                    RateAmountExclVAT = AVG(RateAmount) / 1.15
            FROM    ReservationStayDate f
            GROUP BY f.ReservationStayID
        ) AS f
            ON f.ReservationStayID = a.ReservationStayID
WHERE   a.PrimaryGuest='+' 
AND     d.rsl_primaryguest='+'
AND     A.ARRIVALDATE <= '2013-09-30' 
AND     A.DEPARTUREDATE > '2013-09-01'
AND     NOT (d.RatePlan like 'CO%' AND f.RateAmountExclVAT = 0)
ORDER BY a.ReservationStayID

值得注意的一件事是我已经删除了AS 'alias'语法,因为不推荐使用文字作为列别名。 [进一步阅读Bad Habits to Kick : Using AS instead of = for column aliases 。我还建议using meaning table aliases而不仅仅是a,b,c等。

答案 1 :(得分:0)

试试这个

Select * from ReservationStayDate M
join
(SELECT f.ReservationStayID,avg(RateAmount)/1.15 R
FROM ReservationStayDate f
where f.ReservationStayID = a.ReservationStayID
and  d.rateplan not like 'CO%'
 group by    f.ReservationStayID
) AS E
on  E.ReservationStayID = M.ReservationStayID 
where E.r = 0

或试试这个

(SELECT E.R
FROM ReservationStayDate f
join
    (SELECT f.ReservationStayID,avg(RateAmount)/1.15 R
    FROM ReservationStayDate f1
    whered.rateplan not like 'CO%'
     group by    f.ReservationStayID
    ) AS E
    on  E.ReservationStayID = F.ReservationStayID 
where E.r = 0

) AS 'Rate Amount Excl.VAT'

答案 2 :(得分:0)

获取现有查询并删除WHERE子句的这一部分:

and (avg(RateAmount)/1.15)= 0

然后像这样重写:

SELECT * FROM (

<your original query>

) a WHERE a.[Rate Amount Excl.VAT] != 0;

这不是最漂亮的方式,但没有完整的查询......