オーダー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のところで構文エラーになります。
ここをどのように変えれば意図どおりの動きをするようになるのか知りたいです。
よろしくお願いします。
No.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
;
お返事が遅くなりました。
試してみたのですが、FirebirdはFROM句の副問い合わせはサポートしていないようです。
>selectでの選択と条件式で、二重に「code=10」のデータを得るSQLになってますよ?
承知していたのですが、どうも巧い書き方が思いつかなかったので上記の形になりました。かじりかけの知識での質問申し訳ないです。
結局、CREATE VIEWで一つ表を作っておいて、その表を呼び出して集計する形でひとまず落ち着きました。(やはり書き方がまずくてパフォーマンスは悪いのですが…)
回答ありがとうございました。
No.1
- 回答日時:
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 は何でしょう。
回答ありがとうございます。
Firebirdという無料のDBMSを使用しています。
FROM句でASを使うとエラーになってしまいました。
マイナーDBMSではあるものの、標準的なSQLは使えると思うのですが…。
それにしても同じテーブルを副問合せに使えるとは知りませんでした。
Firebirdで同じ手法が使えないかもうちょっと探ってみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) VBAの繰り返し処理について教えてください。 3 2022/08/02 13:21
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) エクセル VBAについて 2 2022/05/16 16:33
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オシロスコープYOKOGAWA DL708...
-
Activation codeとは
-
★★PL/SQLにてTBL内容をCS...
-
pandasでsqlite3にテーブル作成...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
Excelでしりとりを作る方法
-
Accessで最新のレコード...
-
truncate tableを使って複数の...
-
エラーを起こす方法
-
次の時間帯の勝率の合計を求め...
-
Accessの構成をコピーしたい
-
sqlに記述できない文字
-
PostgreSQLのtimestamp型で時間...
-
SQLのテーブルにないデータの出力
-
1つのドメインを複数のDNSで管...
-
認知心理学で言うスクリプトとは?
-
フラグをたてるってどういうこ...
-
自作アプリからAPIで他のアプリ...
-
SQL ServerのXMLスキーマがうま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テーブル名が可変の動的SQLをフ...
-
実行時エラー:2517 プロシージ...
-
CPRM decrypterのエラーコード...
-
B4サイズは?mmx?mmですか?
-
Oracl[10g]の SQL文について(No.8)
-
Activation codeとは
-
PostgreSQL : 多値従属性(第四...
-
オシロスコープYOKOGAWA DL708...
-
オラクルDBでの不一致の検索
-
JIS地域コード
-
翻訳お願いします 日→英
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
おすすめ情報