サブクエリで比較・優先てできますか?


studio-take  2012-08-07 21:36:01  No: 42724

Delphiと離れてすいません。

受注予定(OrderPlan)と受注確定(OrderDecide)テーブルがあり、
それぞれに数量(Amount)があります。

準備数量を割り出すために、SUM(OrderDecide.Amount)が0以上ならばこちらを使い、無ければSUM(OrderPlan.Amount)を使い、外側SQLでSUMしたいのですが、
比較して優先する部分が検討つきません。

お手数ですが、ご教授願います。


igy  2012-08-08 04:33:18  No: 42725

>準備数量を割り出すために、SUM(OrderDecide.Amount)が0以上ならばこちらを使い、
>無ければSUM(OrderPlan.Amount)を使い、外側SQLでSUMしたいのですが、
>比較して優先する部分が検討つきません。

この部分、ちょっと意味がわからない気が・・・(私だけ?)

もう少し(データの例なども含めて)詳しく書いていただけけると
回答しやすいかもしれません。


studio-take  2012-08-08 06:16:25  No: 42726

igyさんいつもありがとうございます。

説明不足でした。
必要なのは、指定日の商品の準備総量です。
受注予定と受注確定は、納品先によってそれぞれレコードが違うので、
必要数量は、SUM()で足したいのです。
配達日(DELIVERDAY)と商品コード(ITEMCODE)で絞ります。
納品先によっては、予定数量があっても実際受注がなかったりで、
これを、メインのWHERE句でいくのか、サブクエリの中でWHERE句でいくのか、
考えあぐねています。

受注予定の総量だけなら
SELECT ITEMCODE,SUM(AMOUNT) AS SUM_AMOUNT
FROM OrderPlan
WHERE DELIVERDAY = :DELIVERDAY
AND ITEMCODE = :ITEMCODE
GROUP BY ITEMCODE

これでいけるんですけど。
後日、必要数量を確認するときに実際の確定を混ぜる話になってしまい、
比較積算しなくてはいけなくなりました。


nobukoshi802  2012-08-08 06:42:50  No: 42727

対象DBも書いていないので、憶測ですが
自分なら受注予定をメインとして受注確定はOuterJoinにして結合する。
数量比較部分はCASE文で比較するビューを作成します。


igy  2012-08-08 08:30:06  No: 42728

実際、動かした訳ではないので、まったくの勘ですが、

SELECT 
    OP.ITEMCODE
   ,(CASE WHEN EXISTS (SELECT * FROM OrderDecide OD WHERE OD.DELIVERDAY = OP.DELIVERDAY AND OD.ITEMCODE = OP.ITEMCODE)
      THEN
         (SELECT SUM(OD.AMOUNT) FROM OrderDecide OD WHERE OD.DELIVERDAY = OP.DELIVERDAY AND OD.ITEMCODE = OP.ITEMCODE) 
      ELSE
         SUM(OP.AMOUNT)
     END) AS SUM_AMOUNT
FROM OrderPlan OD
WHERE OP.DELIVERDAY = :DELIVERDAY
AND OP.ITEMCODE = :ITEMCODE
GROUP BY OP.ITEMCODE

みたいな感じは、いかがですか?(3行目はOrderDecideテーブルに数量0のレコードがないことを前提としています・・・)


igy  2012-08-08 16:20:41  No: 42729

訂正です。

誤:FROM OrderPlan OD
正:FROM OrderPlan OP


studio-take  2012-08-08 18:17:33  No: 42730

igyさん、nobukoshiさんありがとうございます。

igyさんのSELECT 〜 FROM間のcaseを使ったサブクエリでやってみようと思います。
FROM ()  か WHERE () しか、頭になかったので、挑戦してみます。


studio-take  2012-08-10 02:30:37  No: 42731

たびたびで、すいません。
SUM()とかAVG()の中に直SELECT文を入れるのは駄目なんですか?
DBはFireBirdです。

SELECT
OP.ITEMCODE,
SUM(
SELECT SUM(OD.AMOUNT) FROM OrderDecide OD
) AS SUM_AMOUNT
FROM


studio-take  2012-08-10 02:35:36  No: 42732

このサンプルだと、4行目1コラムのSELECTがおかしいと返ってきます。


igy  2012-08-10 03:31:39  No: 42733

> SUM()とかAVG()の中に直SELECT文を入れるのは駄目なんですか?

だめだと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加