带有GROUP子句的SQL SUM给出错误

时间:2011-12-16 03:44:00

标签: sql sqlplus

我已经访问了这个网站一段时间了,这里的许多回复都是最有帮助的。但是,我现在遇到了一个我似乎无法找到正确解决方案的SQL。

($ packplant和$ ym已经在程序的早期定义)

SELECT 
    A.in_house_supplier_cd,
    B.maker_cd,
    A.packing_plant_cd,
    A.parts_no, 
    substr(A.actual_delivery_date,1,6), 
    A.actual_delivered_qty 
FROM 
    TRN_DELIVERY_NO A, 
    TRN_PARTS B 
WHERE 
    A.ISSUE_NO = B.ISSUE_NO 
    AND A.PACKING_PLANT_CD = '$packplant' 
    AND B.PACKING_PLANT_CD = '$packplant' 
    AND A.PARTS_NO = B.PARTS_NO 
    AND A.IN_HOUSE_SUPPLIER_CD = B.IN_HOUSE_SUPPLIER_CD 
    AND A.ACTUAL_DELIVERY_DATE LIKE '$ym%' 
ORDER BY 
    in_house_supplier_cd, maker_cd, parts_no;

这个sql工作正常。但是,我需要的是将“A.actual_delivered_qt”作为总和(A.actual_delivered_qty)...换句话说,我需要特定部分的总和而不是接收到的单个数量。

当我添加“sum ..”部分(或者甚至添加GROUP BY parts_no)时,sql会给出“列模糊定义”错误。

我相信我已经为每一栏分配了正确的表格,因此如果有人能指出错误,我会非常感激,因为我已经坚持了很长一段时间。干杯!

3 个答案:

答案 0 :(得分:1)

您需要添加GROUP BY语句,例如在parts_no上,但是您的select语句中的其余列会出现问题。

例如,如果您在同一部分中有3条记录,并且您在不同日期没有分组,并且您按part_no进行分组并计算该组编号中的项目总数,则该日期不再有意义。您可以做的最好的事情是从日期中选择最大值,但同样,这并没有多大意义。

当您按part_no进行分组,然后修改select语句中的列以满足此新设计时,您应该考虑在select语句中包含哪些数据真正有意义。

答案 1 :(得分:0)

添加组时,请确保包含表别名(如a.parts_no)。您可以添加“新”查询,包括总和和分组吗?

答案 2 :(得分:0)

仅供参考,根据PostgreSQL 9.1 Documentation - 3.5. Window FunctionsMicrosoft - OVER Clause (Transact-SQL) - (SQL 2008)(但他们有MS SQL 2005的链接 同样)不严格需要GROUP BY。只需看看Sample SQL查询

的PostgreSQL:

SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary DESC) FROM empsalary;

MS SQL:

USE AdventureWorks2008R2;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO

我从未使用SQL Plus,但看起来as well支持OVER子句。

相关问题