Sql server 在where子句中使用计算列
我试图在where子句中使用计算列 我尝试了从交叉应用到子查询选择的所有方法,但它并没有提供接近我需要的任何东西 到目前为止,我的问题是:Sql server 在where子句中使用计算列,sql-server,tsql,where-clause,calculated-columns,Sql Server,Tsql,Where Clause,Calculated Columns,我试图在where子句中使用计算列 我尝试了从交叉应用到子查询选择的所有方法,但它并没有提供接近我需要的任何东西 到目前为止,我的问题是: SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) FROM [dbo].Customer c LEFT JOIN [dbo].OrderHeader oh ON oh.CustomerId = c.Id LEFT JOIN [db
SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) 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
WHERE Sales > 100
GROUP BY p.Code, c.AccountNumber, Sales
这不起作用,因为“Sales”是无效列您需要将内部查询包装在派生表或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;
如果是计算列,可以使用have
SELECT p.Code, c.AccountNumber, Sales = (SUM(p.UnitPrice) * SUM(od.QtyShipped)) 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, Sales
HAVING SALES > 100;
您可以为此使用公共表表达式 ;以CTE为例 选择p.代码、c.AccountNumber、Sales=SUMp.UnitPrice*SUMod.QtyShipped FROM[dbo]。客户c 左联接[dbo]。oh.CustomerId=c.Id上的OrderHeader oh 左连接[dbo]。od上的OrderDetail od.OrderHeaderId=oh.Id 左连接[dbo]。p.Id=od.ProductId上的产品p 按p.代码、c.帐号、销售额分组 挑选* 来自CTE,其中CTE.销售额>100
你们能用SUMp.UnitPrice*SUMod.QtyShipped>100代替WHERE吗?请参见hi stuart,i get:Msg 130,级别15,状态1,第4行无法对包含聚合或子查询的表达式执行聚合函数。sql不是我喜欢的东西,所以我不知道这个消息的意思:$Sales计算应该是这样的:seash.UnitPrice*od.QtyShippedi看到你做了什么,谢谢。所以我也在学习:。谢谢。很遗憾,没有。您可以在ORDER BY中使用列别名,但不能在HAVING中使用-您需要在HAVING like@Jonny的注释中重复完整的计算,或者包装计算列。