SQL嵌套Sums的位置

时间:2012-03-23 23:33:45

标签: sql oracle sum

我遇到了SQL的语法问题。我在这里要做的是将每个订单支付的所有金额(每个支付)加在一起,然后只选择那些大于特定订单#(1008)的每个支付金额之和的金额。我一直试图在这里移动许多不同的东西,我没有运气。

这就是我现在所拥有的,尽管我有很多不同的东西。尝试使用它只会返回一个未正确结束的SQL语句错误。你们给予的任何帮助都将不胜感激。我必须在这里的任何地方使用DISTINCT吗?

SELECT ORDER#,
    TO_CHAR(SUM(PAIDEACH), '$999.99') AS "Amount > Order 1008"
FROM ORDERITEMS 
GROUP BY ORDER# 
WHERE TO_CHAR > (SUM (PAIDEACH)) 
WHERE ORDER# = 1008;

3 个答案:

答案 0 :(得分:2)

某些版本的SQL将哈希字符(#)视为注释的开头。其他人使用双连字符(--),有些人同时使用。所以,我的第一个想法是你的ORDER#字段命名不正确(虽然我无法想象引擎会让你创建一个具有该名称的字段)。

您有两个WHERE个关键字,这是不允许的。如果您有多个WHERE条件,则必须使用布尔逻辑将它们链接在一起,并使用ANDOR个关键字。

WHERE之后你的GROUP BY条件应该被撤销。在WHERE之前指定GROUP BY条件。

您的WHERE条件之一毫无意义。 TO_CHAR > (SUM(paideach)):TO_CHAR()是一个函数,据我所知是一个Oracle函数,它根据指定的格式将数值转换为字符串。 SQL Server中的等效项是CAST or CONVERT

我猜你正在尝试编写一个查找金额超过特定值的订单的查询,但不是很清楚,因为你的WHERE条件之一指定订单号应为1008,可能只会返回一条记录。

查询应该看起来更像这样:

SELECT order,
    SUM(paideach) AS amount
FROM orderitems
GROUP BY order
HAVING amount > 999.99;

这将从orderitems表中选择paideach总和超过999.99的记录。

我不确定订单1008是如何适应的,所以你必须详细说明。

答案 1 :(得分:1)

其他人评论了您的查询有些错误。我会尝试提供更明确的提示,说明我认为你需要做些什么才能得到我认为你正在寻找的结果。

问题似乎分为不同的部分,首先找到你接近的每个订单的总数,我想可能是从以下开始:

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT
FROM ORDERITEMS
GROUP BY ORDER#;

...查找特定订单的总数:

SELECT SUM(PAIDEACH)
FROM ORDERITEMS
WHERE ORDER# = 1008;

......并将它们结合起来,这就是你被困住的地方。最简单的方法,也希望你最近教过的东西,是使用HAVING后面的GROUP BY子句,它可以作为一种可以应用于聚合列的过滤器(你不能在WHERE子句中做到这一点。如果您有固定金额,您可以这样做:

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT
FROM ORDERITEMS
GROUP BY ORDER#
HAVING SUM(PAIDEACH) > 5;

(注意,由于@Bridge表示你不能使用列别名AMOUNT,在having子句中,你必须重复聚合函数SUM)。但是您没有固定值,您希望使用订单1008的实际总数,因此您需要将该固定值替换为另一个查询。我会让你采取最后一步......

答案 2 :(得分:0)

我不熟悉甲骨文,因为它是家庭作业我不会给你答案,只是对我认为错误的一些想法。

  • select语句应该只有一个where语句 - 当然可以有多个条件,只能用逻辑运算符分隔(任何计算结果为true的东西都会包含在内)。例如。 :WHERE (column1 > column2) AND (column3 = 100)

  • 分组语句应在WHERE条款

  • 之后
  • 您不能通过别名来引用您在同一语句的where子句中的select中别名的列。例如,这不起作用:

    SELECT column1 as hello FROM table1 WHERE hello = 1

  • 如果有group by,您选择的列应与该声明中的列(或其聚合)相同。 This页面比我更好地解释了这一点。