2011-12-16 49 views
2

我一直在訪問這個網站一段時間,現在許多回復對我來說最有幫助。但是,我現在堅持使用SQL,我似乎無法找到適合的解決方案。SQL SUM和GROUP子句給出錯誤

($的和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)......換句話說,我需要的是特定部分的總和而不是接收到的單個數量。

當我添加了「總和..」部分(或者甚至與添加GROUP BY parts_no)中,SQL提供了一個「定義的含糊列」錯誤。

我相信,我已經指派了正確的表,每列,因此會很感激,如果我一直堅持這個相當長的一段時間,現在有人可以指出錯誤。乾杯!

+0

你究竟在SUM和GROUP BY中放入了什麼東西,哪些列是否抱怨模糊不清? – brianestey 2011-12-16 03:52:14

回答

1

您需要在parts_no添加GROUP BY語句,例如,但隨後你將有一個問題與列在select語句的其餘部分。

舉例來說,如果你有3個紀錄爲同一型號在不同的日子,你是通過PART_NO分組和該組號碼中計算項目的總數量,日期不再有意義。你可以做的最好的是從日期中選擇最大值,但再次,這沒有多大意義。

你應該想想真正的數據是有意義的,當你被PART_NO分組,然後修改在select語句中的列,以滿足這種新設計的SELECT語句包含。

+0

「日期」部分實際上是年份(yyyymm)。因此,我想要的是獲得該月的總數,而不管該項目收到的日期/時間。 – 2011-12-16 04:19:09

+0

好吧,我不熟悉sqlplus的精確語法,但是您應該能夠爲MAX添加類似於每個未加總的列,然後求和您想要總計的列。 – 2011-12-16 04:34:05

0

當您添加通過確保包含表的別名(如a.parts_no)組。你可以添加你的「新」查詢,包括總和和組?

0

只是FYI,根據PostgreSQL 9.1 Documentation - 3.5. Window FunctionsMicrosoft - OVER Clause (Transact-SQL) - (SQL 2008)(但它們也有MS SQL 2005 的鏈接)GROUP BY不是嚴格需要的。只是看看樣本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中,但它看起來像OVER子句支持有as well