2012-03-23 48 views
0

我遇到了SQL的语法问题。我在这里要做的是将每个订单支付的所有金额(每个付款)加在一起,然后仅选择那些大于特定订单#(1008)的付款总和的订单。我一直在尝试在这里转移很多不同的东西,而且我没有任何运气。SQL嵌套在哪里与总和

这就是我现在的情况,虽然我有很多不同的东西。试图使用这个只是返回一个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; 

回答

2

某些版本的SQL将散列字符(#)视为注释的开始。其他人使用双连字符(--),有些使用两者。所以,我的第一个想法是,你的ORDER#字段命名不正确(尽管我无法想象引擎会让你创建一个带有该名称的字段)。

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

你有你的WHERE条件应该被逆转后GROUP BY。在GROUP BY之前指定WHERE条件。

你的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如何适应事情,所以你必须详细说明。

+0

+1。由于该列被称为'Column#',我猜这就是订单号。为此添加一个“where”子句,我想OP有他的答案! – Bridge 2012-03-24 00:16:12

+0

我很确定那里应该有一个子查询,它不知何故导致了两个'where'子句。我认为它应该找到所有'订单#'总共'paideach'大于订单1008的总数。999.99只是输出的格式掩码,而不是用于比较的值。 (在ORACLE中,'order#'可以作为字段名称;'order'不会像保留字那样)。 – 2012-03-24 09:36:12

0

我不熟悉Oracle,因为它的功课我不会给你答案,只是我认为是错误的一些想法。

  • select语句应该只有一个WHERE语句 - 能有当然不止一个条件,仅仅通过逻辑运算符(任何计算结果为true将包括)分离。例如。 :WHERE (column1 > column2) AND (column3 = 100)

  • 集团通过报表应后WHERE条款

  • 你不能指你已经通过他们的别名名称别名在选择相同语句的where子句中的列。例如,这将不起作用:

    SELECT column1 as hello FROM table1 WHERE hello = 1

  • 如果有一个group by,(那些或者集合)你选择应该是相同的列在该声明。 This页面比我做的更好的解释。

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的实际总数,因此您需要用另一个查询替换该固定值。我会让你采取最后一步......