Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在where子句中使用计算列_Sql Server_Tsql_Where Clause_Calculated Columns - Fatal编程技术网

Sql server 在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

我试图在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 [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的注释中重复完整的计算,或者包装计算列。