SQLについて教えてください。以下のカラムを持

Writer: admin Type: foresth Date: 2019-01-08 00:00
SQLについて教えてください。以下のカラムを持つ注文テーブルがあります。伝票番号 明細番号 注文取消フラグ100 1 0100 2 0101 1 1101 2 0102 1 1このとき、入力した伝票番号の注文取消フラグ=0の明細数を取得したいと考えています。上記のテーブルでは、100を入力したときは2、101を入力したときは1となります。そして、以下の条件が当てはまるときは、エラーメッセージを出力します。1.入力した伝票番号がテーブルに存在しない場合は、「入力した伝票番号は存在しません」2.入力した伝票番号にすべて注文取消フラグに1が設定されている場合は、「外套の伝票番号は全て注文が取り消しされています」select * count(*)from 注文テーブルwhere 伝票番号 = :画面から入力した伝票番号and 注文取消フラグ = 0このSQLだと、存在しない伝票番号を入力した場合でも0となり、1のチェックができません1のチェックに引っかかる場合はnull(もしくは-1などの負数)、2のチェックに引っかかる場合は0、チェックに引っかからない場合は明細数を取得するsqlは、どのように作成すればよろしいでしょうか?共感した0###SELECT 伝票番号, COUNT(*) CNT,SUM( CASE WHEN 注文取消フラグ = 0 THEN 1 ELSE 0 END ) CNT2FROM 注文テーブルWHERE 伝票番号 = :画面から入力した伝票番号GROUP BY 伝票番号・CNTが0なら入力した伝票番号はテーブルに存在しない・CNT2が 取消されていない注文の件数。CNT>0でCNT2=0なら全件取消し・上記以外ならCNT2が有効な注文件数SQL一文だとするとSELECT CASE WHEN CNT=0 THEN NULL WHEN CNT>0 AND CNT2=0 THEN O ELSE CNT2 END RESULTFROM (SELECT 伝票番号, COUNT(*) CNT,SUM( CASE WHEN 注文取消フラグ = 0 THEN 1 ELSE 0 END ) CNT2FROM 注文テーブルWHERE 伝票番号 = :画面から入力した伝票番号GROUP BY 伝票番号 )でしょうか。ナイス0
###訂正SELECT CASE WHEN CNT=0 THEN NULLWHEN CNT>0 AND CNT2=0 THEN 0ELSE CNT2 END RESULTFROM (SELECT COUNT(*) CNT,SUM( CASE WHEN 注文取消フラグ = 0 THEN 1 ELSE 0 END ) CNT2FROM 注文テーブルWHERE 伝票番号 = :画面から入力した伝票番号 )
###この質問は投票によってベストアンサーに選ばれました!###SELECT伝票番号,casewhen min(注文取消フラグ) = 9 then -1when min(注文取消フラグ) = 1 then 0else sum(case when 注文取消フラグ = 0 then 1 else 0 end)endFROM(select 伝票番号, 注文取消フラグ from 注文テーブルunion allselect :画面から入力した伝票番号, 9 from DUAL)GROUP BY伝票番号HAVING伝票番号 = :画面から入力した伝票番号ナイス0

 

TAG