【问题标题】:List all of the donors who have donated a total amount greater than something列出所有捐赠总额大于某物的捐赠者
【发布时间】:2015-07-28 15:23:54
【问题描述】:

这是表结构

捐赠者(donorID,姓名)

捐款(ID、donorID、金额)

这是我的查询:

SELECT donor.name, SUM(donation.amount) "Total"
FROM donor, donation
WHERE donor.donorID = donation.donorID
AND SUM(donation.amount) > 1000;
GROUP BY donor.name
ORDER BY SUM(donation.amount) DESC;

这里是错误:

ORA-00934: 此处不允许使用群组功能 00934. 00000 - “此处不允许使用群组功能”

当我删除 sum(donation)

【问题讨论】:

  • 使用Having Sum(donation.amount) > 1000
  • AND SUM(donation.amount) > 1000;消除 ;在这一行的末尾(或者它只是一个错字?)

标签: sql oracle


【解决方案1】:

您不能将聚合函数放在where 子句中。你需要一个having 子句:

SELECT donor.name, SUM(donation.amount) "Total"
FROM donor, donation
WHERE donor.donorID = donation.donorID
GROUP BY donor.name
HAVING SUM(donation.amount) > 1000
ORDER BY SUM(donation.amount) DESC;

但是,您应该学会使用正确的join 语法和表别名:

SELECT d.name, SUM(dn.amount) as "Total"
FROM donor d JOIN
     donation dn
     ON d.donorID = dn.donorID
GROUP BY d.name
HAVING SUM(dn.amount) > 1000
ORDER BY SUM(dn.amount) DESC;

【讨论】:

  • 谢谢!我不确定为什么使用“有”是正确的方法,除了这个例子之外,在某些情况下使用我的方法也有效,关于何时使用有更清晰的例子?
  • 在过滤聚合函数(例如 SUM())时,您总是使用 have。
【解决方案2】:

您需要像这样使用 HAVING 子句:

SELECT donor.name, SUM(donation.amount) "Total"
FROM donor, donation
WHERE donor.donorID = donation.donorID
GROUP BY donor.name
HAVING SUM(donation.amount) > 1000
ORDER BY SUM(donation.amount) DESC;

此外,正如 Marc B 指出的那样,分号位于终止查询的错误位置。

【讨论】:

    【解决方案3】:

    错别字:

    AND SUM(donation.amount) > 1000;
                                   ^---terminates query
    GROUP BY donor.name
    

    group by 不是启动新查询的有效方式。

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2013-03-29
      • 1970-01-01
      • 2021-10-25
      • 2011-03-09
      • 2015-03-10
      • 2010-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多