アプリ版:「スタンプのみでお礼する」機能のリリースについて

オーダーNo.毎に集計するSQLを考えているのですが、少しSELECT文法で行き詰まってしまったので教えてください。

オーダーNo.毎にグループ化して、コード別の件数を集計します。
そして、コードが「10」のものが1件でもあれば表示する、というようなことを考えています。

SELECT ORDERNO,
SUM(CASE WHEN CODE = 0 THEN 1 ELSE 0 END) AS CODE0,
SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) AS CODE10,
SUM(CASE WHEN CODE > 0 THEN 1 ELSE 0 END) AS CODEALL
FROM DBORDER
WHERE SUM(CASE WHEN CODE = 10 THEN 1 ELSE 0 END) > 0
GROUP BY ORDERNO
ORDER BY ORDERNO

このようにすると、WHEREのところで構文エラーになります。
ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。
よろしくお願いします。

A 回答 (2件)

性能はどうでもいいのでしょうか?



selectでの選択と条件式で、二重に「code=10」のデータを得るSQLになってますよ?
Firebirdでのサポート状況が分かりませんが、例えば下記のようなSQLではどうでしょう?

【SQL例】
select * from
(
select
orderno,
sum(case when code=0 then 1 else 0 end) as code0,
sum(case when code=10 then 1 else 0 end) as code10,
sum(case when code>0 then 1 else 0 end) as codeall
from dborder as a
group by orderno
) as x
where x.code10>0
order by orderno
;
    • good
    • 0
この回答へのお礼

お返事が遅くなりました。

試してみたのですが、FirebirdはFROM句の副問い合わせはサポートしていないようです。

>selectでの選択と条件式で、二重に「code=10」のデータを得るSQLになってますよ?

承知していたのですが、どうも巧い書き方が思いつかなかったので上記の形になりました。かじりかけの知識での質問申し訳ないです。

結局、CREATE VIEWで一つ表を作っておいて、その表を呼び出して集計する形でひとまず落ち着きました。(やはり書き方がまずくてパフォーマンスは悪いのですが…)

回答ありがとうございました。

お礼日時:2006/11/30 15:57

FROM 句を


FROM DBORDER AS B
WHERE 句を副問い合わせにして

WHERE 0 < (SELECT SUM(CASE WHEN A.CODE = 10 THEN 1 ELSE 0 END)
FROM DBORDER AS A
WHERE A.ORDERNO = B.ORDERNO)

じゃだめですかね。(主の方のフィールドにはB.をつける)

環境がないので・・^^;
DBMS は何でしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Firebirdという無料のDBMSを使用しています。
FROM句でASを使うとエラーになってしまいました。

マイナーDBMSではあるものの、標準的なSQLは使えると思うのですが…。
それにしても同じテーブルを副問合せに使えるとは知りませんでした。
Firebirdで同じ手法が使えないかもうちょっと探ってみます。

お礼日時:2006/11/27 16:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す