SQL SUM с предложением GROUP дает ошибки - PullRequest
2 голосов
/ 16 декабря 2011

Я уже давно посещаю этот сайт, и многие ответы здесь были самыми полезными.Однако теперь я застрял с 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 ]

1 голос
/ 16 декабря 2011

Вам нужно будет добавить оператор GROUP BY, например, для parts_no, но тогда у вас возникнет проблема с остальными столбцами в вашем операторе select.

Например, если у вас есть 3 записи для одной и той же детали в разные дни, и вы группируете по part_no и вычисляете общее количество элементов в этом номере группы, дата больше не имеет смысла. Лучшее, что вы можете сделать, это выбрать максимальное значение из даты, но опять же, это не имеет особого смысла.

Вам следует подумать о том, какие данные действительно имеет смысл включать в оператор выбора при группировании по part_no, а затем пересмотреть столбцы в операторе выбора, чтобы соответствовать этому новому дизайну.

0 голосов
/ 16 декабря 2011

Только к вашему сведению, согласно Документация PostgreSQL 9.1 - 3.5.Функции окна и Microsoft - предложение OVER (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 .

0 голосов
/ 16 декабря 2011

Когда вы добавляете группу, убедитесь, что вы включили псевдоним таблицы (например, a.parts_no). Можете ли вы добавить свой «новый» запрос, включая сумму и группу, по?

...