Delphiと離れてすいません。
受注予定(OrderPlan)と受注確定(OrderDecide)テーブルがあり、
それぞれに数量(Amount)があります。
準備数量を割り出すために、SUM(OrderDecide.Amount)が0以上ならばこちらを使い、無ければSUM(OrderPlan.Amount)を使い、外側SQLでSUMしたいのですが、
比較して優先する部分が検討つきません。
お手数ですが、ご教授願います。
>準備数量を割り出すために、SUM(OrderDecide.Amount)が0以上ならばこちらを使い、
>無ければSUM(OrderPlan.Amount)を使い、外側SQLでSUMしたいのですが、
>比較して優先する部分が検討つきません。
この部分、ちょっと意味がわからない気が・・・(私だけ?)
もう少し(データの例なども含めて)詳しく書いていただけけると
回答しやすいかもしれません。
igyさんいつもありがとうございます。
説明不足でした。
必要なのは、指定日の商品の準備総量です。
受注予定と受注確定は、納品先によってそれぞれレコードが違うので、
必要数量は、SUM()で足したいのです。
配達日(DELIVERDAY)と商品コード(ITEMCODE)で絞ります。
納品先によっては、予定数量があっても実際受注がなかったりで、
これを、メインのWHERE句でいくのか、サブクエリの中でWHERE句でいくのか、
考えあぐねています。
受注予定の総量だけなら
SELECT ITEMCODE,SUM(AMOUNT) AS SUM_AMOUNT
FROM OrderPlan
WHERE DELIVERDAY = :DELIVERDAY
AND ITEMCODE = :ITEMCODE
GROUP BY ITEMCODE
これでいけるんですけど。
後日、必要数量を確認するときに実際の確定を混ぜる話になってしまい、
比較積算しなくてはいけなくなりました。
対象DBも書いていないので、憶測ですが
自分なら受注予定をメインとして受注確定はOuterJoinにして結合する。
数量比較部分はCASE文で比較するビューを作成します。
実際、動かした訳ではないので、まったくの勘ですが、
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のレコードがないことを前提としています・・・)
訂正です。
誤:FROM OrderPlan OD
正:FROM OrderPlan OP
igyさん、nobukoshiさんありがとうございます。
igyさんのSELECT 〜 FROM間のcaseを使ったサブクエリでやってみようと思います。
FROM () か WHERE () しか、頭になかったので、挑戦してみます。
たびたびで、すいません。
SUM()とかAVG()の中に直SELECT文を入れるのは駄目なんですか?
DBはFireBirdです。
SELECT
OP.ITEMCODE,
SUM(
SELECT SUM(OD.AMOUNT) FROM OrderDecide OD
) AS SUM_AMOUNT
FROM
このサンプルだと、4行目1コラムのSELECTがおかしいと返ってきます。
> SUM()とかAVG()の中に直SELECT文を入れるのは駄目なんですか?
だめだと思います。
ツイート | ![]() |