2011-12-16 3 views
2

Я посетил этот сайт какое-то время, и многие из ответов здесь были наиболее полезными. Тем не менее, я теперь застрял с SQL, который, я не могу найти подходящее решение.SQL SUM с предложением GROUP, дающим ошибки

(за $ packplant и $ Ут уже определена ранее в программе)

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 дает «столбцовую двусмысленную» ошибку.

Я считаю, что я уже назначил правильную таблицу для каждого столбца, и поэтому был бы очень признателен, если бы кто-то мог указать на ошибки, поскольку я уже давно застрял с этим. Ура!

+0

Что именно вы пытались вставить в СУММ и GROUP BY, а в каких столбцах он жаловался на двусмысленность? – brianestey

ответ

1

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

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

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

+0

Часть «дата» на самом деле год-месяц (yyyymm). Поэтому я хотел бы получить общее количество этого месяца, независимо от того, какая дата/время было получено. –

+0

Хорошо, я не знаком с точным синтаксисом для sqlplus, но вы должны иметь возможность добавлять что-то вроде MAX в каждый из не суммированных столбцов, а затем суммировать столбцы (столбцы), для которых вы хотите получить итоговые значения. –

+0

Был вне города на выходные, так что не получил чакну, чтобы обновить сообщение. Мне удалось заставить запрос SQl работать (получил ответ от другого потока). По-видимому, мне пришлось добавить весь раздел «select» (кроме части «sum (...)» в предложение GROUP BY, и это сработало! В любом случае .. спасибо всем за вашу помощь и время:) –

0

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

0

Just FYI, в соответствии с PostgreSQL 9.1 Documentation - 3.5. Window Functions и Microsoft - 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, но это выглядит как пункт OVER поддерживается там as well.

+0

Мне неизвестно, какой вариант SQL использовался до тех пор, пока я не написал большую часть этого комментария, извините.Но он демонстрирует, что «OVER» обычно реализуется. – JayC

 Смежные вопросы

  • Нет связанных вопросов^_^