【问题标题】:Why AVG() give no result?为什么 AVG() 没有结果?
【发布时间】:2016-09-23 11:16:41
【问题描述】:

我尽量只选择体重超过所有狗平均体重的狗。

我有这个 SQL 查询:

SELECT nameAni, weigth
   FROM Animal
WHERE idTpAni IN (SELECT idTpAni
            FROM TypeAnimal
          WHERE libTpAni = 'DOG')
GROUP BY nameAni
HAVING AVG(weigth) < weigth;

如果我给小费 30 而不是 AVG(weigth),我会得到我想要的结果。

你能解释一下为什么我在输入“AVG(...)”时没有结果吗?

【问题讨论】:

  • 您不需要group by 重量,或者至少在列中使用AVG() 之类的聚合吗?
  • 命令只是为了显示狗的名字和体重,所以如果我这样做,我会不服从。但是,出于测试目的,我在选择中添加了一个 AVG() (没有分组依据/有),然后我只得到一行(找到的第一只狗和所有狗的平均值)。

标签: sql average having


【解决方案1】:
SELECT nameAni, weigth
FROM Animal
WHERE idTpAni IN (SELECT idTpAni
                  FROM   TypeAnimal
                  WHERE  Lower(libTpAni) = 'dog')
                  AND    weigth > (SELECT Avg(weigth)
                                   FROM   Animal
                                   WHERE  idTpAni IN (SELECT idTpAni
                                   FROM   TypeAnimal
                                   WHERE  Lower(libTpAni) = 'dog'))

如果你想走简单的路,请参考以下

    DECLARE @weight FLOAT; --mind the type of this variable

    SELECT @weight=Avg(weigth)
    FROM   Animal
    WHERE  idTpAni IN (SELECT idTpAni
    FROM   TypeAnimal
    WHERE  Lower(libTpAni) = 'dog')

    SELECT nameAni, weigth
    FROM   Animal
    WHERE  idTpAni IN (SELECT idTpAni
    FROM   TypeAnimal
    WHERE  Lower(libTpAni) = 'dog')
    AND    weigth > @weight

【讨论】:

  • 谢谢,我做了你回复的第一个版本,它可以工作,但我想知道为什么第二个版本,不需要做两次'select libTpAni'不能使用 avg()但是如果我输入一个数字(30 是平均函数的结果),我也会得到我想要的。我不知道我们可以声明一个变量或如何使用它们,所以非常感谢!
  • 让我解释一下,做一件事,在您的选择查询中包含AVG(weigth) 并执行查询直到 Group By。不要包含包含Having 子句的行。您将得到的结果是 nameAni、weigth 和 Avg_weigth。现在假设您有一只狗,其 nameAni 是“ABC”,体重为 20。您将得到的结果是 nameAni=ABC, weight = 20,并且当使用按名称分组时,它将平均仅“ABC”狗的体重。因此 Avg(Weight) 将再次为 20。所以你的条件 Avg(weight)
  • 因此,如果首先计算权重并将其存储在变量中,则计算平均值,然后在您正在使用的“30”位置使用此变量。
【解决方案2】:
SELECT nameAni, weigth
   FROM Animal
WHERE idTpAni IN (SELECT idTpAni
                    FROM TypeAnimal
                    WHERE libTpAni = 'DOG') AND
        weight > AVG(weigth) over ()

考虑使用分区而不是分组。

【讨论】:

  • 我明天试试,这似乎是我搜索我的 groupby/have 的目的。
猜你喜欢
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多