【问题标题】:select records where value < avg() - incorrect results选择 value < avg() 的记录 - 结果不正确
【发布时间】:2015-02-23 20:21:09
【问题描述】:

我正在做一些关于 NORTHWND db 的基本练习。我想执行以下代码:

SELECT        
    sum(SaleAmount) AS SaleAmount
    , CompanyName

FROM      [Sales Totals by Amount]

where [SaleAmount] > 
(
        Select
        avg(SaleAmount) as SaleAmount
        from [Sales Totals by Amount]
)
group by CompanyName

平均值等于 4409,4948。当我试图获得大于平均值的值时,结果是正确的。当我试图获得低于平均值的值时,它会返回低于和高于平均值的值。 如果您指出我的错误在哪里,我将不胜感激。

【问题讨论】:

  • 您知道WHERE SaleAmount &gt; 使用的是基列,而不是SUM(SaleAmount),对吗?您可以通过为表达式使用更好的别名来避免这种歧义,例如 TotalSaleAmount。
  • 它正在返回sum(SaleAmount)。该数量取决于应用 where 过滤器后数据中的行数。
  • 您是要获取SaleAmount 的值的总和,其中各个值 大于平均值,或者总和大于平均值?跨度>

标签: sql sql-server average


【解决方案1】:

要将过滤器应用于聚合公式,请使用 HAVING 关键字:

SELECT        
    SUM(SaleAmount) AS SaleAmount,
    CompanyName
FROM      [Sales Totals by Amount]
GROUP BY CompanyName
HAVING sum(SaleAmount)  > 
(
        Select
        AVG(SaleAmount) as SaleAmount
        FROM [Sales Totals by Amount]
)

【讨论】:

  • 我不确定它是否会返回正确的结果。 SUM() 高于平均销售额是什么意思?
【解决方案2】:

您也可以使用 CTE 解决此问题:

;WITH TotalSalesByCompany AS (
    SELECT SUM(SaleAmount) AS TotalSaleAmount,
           CompanyName
      FROM [Sales Totals by Amount]
     GROUP BY CompanyName
)
SELECT * 
  FROM TotalSalesByCompany
 WHERE [TotalSalesAmount] > 
       (SELECT AVG(SalesAmount) AS AverageSales FROM [Sales Totals By Amount])

CTE 按公司生成总计列表,SELECT 子句选择总销售额大于平均值的每个公司。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多