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


studio-take  2012-08-07 12:36:01  No: 42724  IP: 192.*.*.*

Delphiと離れてすいません。

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

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

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

編集 削除
igy  2012-08-07 19:33:18  No: 42725  IP: 192.*.*.*

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

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

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

編集 削除
studio-take  2012-08-07 21:16:25  No: 42726  IP: 192.*.*.*

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-07 21:42:50  No: 42727  IP: 192.*.*.*

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

編集 削除
igy  2012-08-07 23:30:06  No: 42728  IP: 192.*.*.*

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

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 07:20:41  No: 42729  IP: 192.*.*.*

訂正です。

誤:FROM OrderPlan OD
正:FROM OrderPlan OP

編集 削除
studio-take  2012-08-08 09:17:33  No: 42730  IP: 192.*.*.*

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

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

編集 削除
studio-take  2012-08-09 17:30:37  No: 42731  IP: 192.*.*.*

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

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

編集 削除
studio-take  2012-08-09 17:35:36  No: 42732  IP: 192.*.*.*

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

編集 削除
igy  2012-08-09 18:31:39  No: 42733  IP: 192.*.*.*

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

だめだと思います。

編集 削除