2011-12-16 11 views
2

私はこのサイトをしばらく訪れてきましたが、ここでは多くの回答が最も役立ちました。しかし、私は今、正しい解決策を見つけることができないようなSQLに悩まされています。GROUP句でエラーを返すSQL SUM

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は正常に動作します($のpackplantと$ YMは、すでに以前のプログラムで定義されます)。しかし、私が必要とするのは、 "A.actual_delivered_qt"を合計(A.actual_delivered_qty)...つまり、受け取った個々の数量ではなく、その特定の部分の合計が必要です。

"sum .."の部分(またはGROUP BYのparts_noを追加した部分)を追加すると、sqlは "あいまいに定義された"エラーを返します。

私はすでにそれぞれの列に正しい表を割り当てていると思いますので、今かなり長い間、この問題に悩まされているので、誰かがエラーを指摘できたら本当に感謝しています。乾杯!

+0

あなたはSUMとGROUP BYに正確に何を入れようとしましたか、そしてどの欄であいまいさについて不平を言ったのですか? – brianestey

答えて

1

たとえば、GROUP BYステートメントをparts_noに追加する必要がありますが、selectステートメントの残りの列で問題が発生します。

たとえば、同じパートのレコードが3つあり、別の日にpart_noでグループ化していて、そのグループ番号内のアイテムの合計数を計算すると、その日付は意味をなさない。あなたができることは、日付から最大値を選択することですが、これはあまり意味がありません。

part_noでグループ化し、この新しいデザインに合わせてselect文の列を修正するときに、select文にどのようなデータが含まれるのが本当に意味があるのか​​考える必要があります。

+0

「日付」部分は実際には年月(yyyymm)です。したがって、私が望むのは、アイテムが受け取られた日付/時刻に関係なく、その月の合計を得ることです。 –

+0

私はsqlplusの正確な構文に精通していませんが、合計しない列のそれぞれにMAXのようなものを追加してから、合計する列を合計する必要があります。 –

+0

週末は町外だったので、ポストを更新するためのチャクンを手に入れませんでした。私は(他のスレッドからの応答を得た)SQlクエリを取得することができました。どうやら、私はGROUP BY句に "select"セクション( "sum(...)"の部分を除く)全体を追加しなければならず、うまくいきました!とにかくあなたの助けと時間のすべてをあなたに感謝します。) –

0

グループを追加するときに、テーブルエイリアス(a.parts_noなど)を含めてください。合計とグループを含む "新しい"クエリを追加できますか?

0

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:私は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 

が、OVER句がサポートされているように見えますas well

+0

私は、そのコメントの大部分を書いた後まで、どのSQL変種が使用されているのか分からなかった。しかし、それは一般的に実装されていることを示しています。 – JayC