1

これがルールに違反しないことを願っています(私は新しいです、そしてはい、私はFAQをチェックしました)。

しかし、私は次のコードを持っています

SELECT DISTINCT PO_NUMBER, PO_TRACKING_NO, SUPPLIER, MIN(PO_QUANTITY),    
      SUM(SHIPPED_WT), PO_SHIPMENT_TO 
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO AND
      (PO_QUANTITY > SHIPPED_WT OR PO_TRACKING_NO IS NULL) 
GROUP BY PO_NUMBER, PO_TRACKING_NO, SUPPLIER, PO_SHIPMENT_TO
HAVING PO_QUANTITY > SUM(SHIPPED_WT)

次のことを行うと想定されます。トラッキングごとに1つのPO#を表示します。 SUM、MIN、GROUP BY、およびHAVINGの部分):任意のPO_NUMBER(表示されている)のSHIPPED_WTを結合し、PO_Quantityよりも小さい場合はその結合された数値を表示する必要がありました

whereステートメントも正しいです。コンパイルに成功したので、上記の部分を追加したときに初めて問題が発生しました。

編集:上記のコードを今すぐコンパイルします(以下の回答に感謝します)

しかし、私のロジックは間違っており、私が望んでいることを実行しません。正しく実行する1つのことは、1つのPO_NUMBERを1つのPO_TRACKING_NOで取得することです(PO_tracking_noが異なる限り、重複するpo_numberが存在する可能性があります。番号が異なる限り、重複した追跡が存在する可能性があります)

編集:以下は関連する列がどのように見えるかです、そして私はそれの何が悪いのか(そして私が改訂されたコードで何をしようとしたのか)を説明します

PO_NUMBER    PO_TRACKING_NO      MIN(PO_QUANTITY)  SUM(SHIPPED_WT)
123          C100                1000              750
123          C101                1000              250

コードは、このようなレコードを取得し、SHIPPED_WTを1つの数値(1000)に結合することを想定しており、その新しい数値はPO_QUANTITYに対して=であるため、クエリに表示されないはずです。さらに、PO_TRACKING_NOのWHERE ISNULLが機能していません(PO_NUMBERとPO_TRACKING_NOの重複ではないと仮定して、そのフィールドにnull値が含まれるすべてのレコードを表示する必要があります)

4

2 に答える 2

3

min、max、sum...などのgroupby句に集計値を含めることはできません。

SELECT PO_NUMBER, PO_TRACKING_NO, SUPPLIER, 
MIN(PO_QUANTITY), SUM(SHIPPED_WT), PO_SHIPMENT_TO 
FROM VW_TRAFFIC_PO_SIDE WHERE SYSDATE > PO_SHIPMENT_TO 
AND (PO_QUANTITY > SHIPPED_WT OR PO_TRACKING_NO IS NULL) 
GROUP BY PO_NUMBER, PO_TRACKING_NO, SUPPLIER, PO_SHIPMENT_TO
HAVING MIN(PO_QUANTITY) > SUM(SHIPPED_WT)

エラーについて読むための参照:ORA-00934:グループ関数はここでは許可されていません|| 最高給与部門のMIN(給与)を選択します。


編集:OPがまだ疑問を持ってコメントしているのでsqlfiddleデモを追加します。

上記のサンプルデモはSQL Server、RDBMSを指定していることがわからないため、SQLに近づくことができる最も近いものです... MYSQLには、loose behaviou towards group_bySQL Server、TSQL、Oracle、およびMSACCESSSQLとの比較が少しあります。 。したがって、上記のクエリは多かれ少なかれANSI標準ですが、日付がテーブルに挿入される方法、GetDate()関数など、いくつかの変更が必要になる場合があります。

しかし率直に言って、クエリの条件のいくつかは実際には意味がありません。

たとえば AND PO_QANTITY > SHIPPED_WT、あなたはそうしHAVING MIN(PO_QUANTITY) > SUM(SHIPPIED_WT)ます...とにかくそれがあなたの要件とみなすように;)

于 2013-01-08T12:30:21.780 に答える
1

PO_TRACKING_NOでグループ化する必要はないと思います。また、WHERE句によって、必要な行が誤って除外される可能性があります。チェックするのは集計です(HAVING句)。COALESCEを使用してNULLを0に置き換える場合、HAVING句はすべてのケースをカバーする必要があります。

SELECT PO_NUMBER, MIN(PO_QUANTITY) AS PO_QUANTITY, SUM(COALESCE(SHIPPED_WT, 0)) AS SHIPPED_WT
FROM VW_TRAFFIC_PO_SIDE
WHERE SYSDATE > PO_SHIPMENT_TO
GROUP BY PO_NUMBER
HAVING MIN(PO_QUANTITY) > SUM(COALESCE(SHIPPED_WT, 0))
于 2013-01-08T14:29:30.053 に答える