在谓词中使用派生列
您需要将内部查询包装在派生表或CTE中,以便能够在 WHERE
子句中使用派生列(此外,注意只使用 SUM()
一次,使用乘法的结果):
SELECT x.Code, x.AccountNumber, x.Sales
FROM
(
SELECT p.Code, c.AccountNumber, SUM(p.UnitPrice *od.QtyShipped) AS Sales
FROM [dbo].Customer c
LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id
LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
LEFT JOIN [dbo].Product p ON p.Id = od.ProductId
GROUP BY p.Code, c.AccountNumber
) AS x
WHERE x.Sales > 100;
在 HAVING 子句中重复使用派生列
如 @Jonny 的评论所述,另一种方式不是将计算的列DRY起来,而是重复计算。在应用了 GROUP BY
之后,使用 HAVING
而不是 WHERE
。
SELECT p.Code, c.AccountNumber, SUM(p.UnitPrice *od.QtyShipped) AS Sales
FROM [dbo].Customer c
LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id
LEFT JOIN [dbo].OrderDetail od ON od.OrderHeaderId = oh.Id
LEFT JOIN [dbo].Product p ON p.Id = od.ProductId
GROUP BY p.Code, c.AccountNumber
HAVING SUM(p.UnitPrice * od.QtyShipped) > 100;
请注意,根据下面的评论,计算表达式应为SUM(p.UnitPrice * od.QtyShipped)
而不是SUM(p.UnitPrice) * SUM(od.QtyShipped)
。
HAVING (SUM(p.UnitPrice) * SUM(od.QtyShipped)) > 100
代替WHERE
?(参见http://www.w3schools.com/sql/sql_having.asp) - Jonny