• ベストアンサー

SQLの抽出条件の記述の仕方について

sqlのselect ~where等で以下のデータが抽出できますでしょうか。 テーブルに以下のデータが格納されています。 県コード  コード 商品名        単価 ------------------------------------------------------------ 01      1000 カメラ(中国製)   10,000円 01     2000 カメラ(日本製)   30,000円   01      3000 カメラ(アメリカ製) 40,000円 ------------------------------------------------------------ 02      1000 カメラ(中国製)   10,000円 02      3000 カメラ(アメリカ製) 40,000円 ------------------------------------------------------------ 上記のようなデータのなから、一つの県から、1つの商品(コード:2000(カメラ(日本製))、3000(カメラ(アメリカ製))、1000(カメラ(中国製))の優先順位で1つを選択)をselect文で抽出可能でしょうか。上記のデータならば、以下のデータを抽出したいのですが。 01     2000 カメラ(日本製)   30,000円 02      3000 カメラ(アメリカ製) 40,000円 2件のみを抽出できますか。

  • Oracle
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • hiro_sun
  • ベストアンサー率27% (14/51)
回答No.1

こんなかんじでどうでしょう? 未検証なので、多少の修正は必要だと思います。 DECODEを使用することで、コードを優先順位(1~3)に置き換えて、 その値が県コードごとの最小値であることをサブクエリを使用し、 条件にしています。 +--------------------------------------------+ SELECT T1.県コード,T1.コード,T1.商品名,T1.単価 FROM テーブル名 T1 WHERE DECODE(T1.コード,2000,1,3000,2,1000,3) = (SELECT MIN(DECODE(T2.コード,2000,1,3000,2,1000,3)) FROM テーブル名 T2 WHERE T1.県コード = T2.県コード);

mpochid
質問者

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

その他の回答 (3)

  • kazu1213
  • ベストアンサー率60% (3/5)
回答No.4

こんな方法もあります。 select 県コード,    substrb(max(decode(コード,2000,2,3000,1,0)           || コード || ' ' || 商品名 || ' ' || 単価),2,        lengthb(max(decode(コード,2000,2,3000,1,0)               || コード || 商品名 || 単価)) + 1)                        "コード 商品名 単価" from tbl group by 県コード; 先頭のdecode文(1桁)を非表示にするためsubstrbを使用しています。 lengthbの+1は表示データから半角スペース2つの連結を取り除いたものを 対象にしているため、decode桁数の差分(-1)に2が加えられ+1となります。 <実行例> 県 -- コード 商品名 単価 -------------------------------------------------------------------------------- 01 2000 カメラ(日本製) 30000 02 3000 カメラ(アメリカ製) 40000

mpochid
質問者

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

回答No.3

分析関数を使うと、こんな感じ。 select 県コード,コード,商品名,単価 from (select x.*,row_number() over(partition by 県コード order by DECODE(コード,2000,1,3000,2,1000,3)) R from TARGET) where R=1

mpochid
質問者

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

  • xKENx
  • ベストアンサー率65% (21/32)
回答No.2

こんな感じでどうでしょうか。 前提として県コードとコードで一意である必要があります。 WITH TMP AS ( SELECT 県コード,コード,商品名,単価 DECODE(コード,2000,1,3000,2,1000,3) AS コード順序 FROM テーブル ) SELECT * FROM TMP WHERE ( 県コード , コード順序) IN ( SELECT 県コード , MIN(コード順序) FROM TMP GROUP BY 県コード )

mpochid
質問者

お礼

早速の回答ありがとうございます。皆さんの回答のおかげで無事抽出する事ができました。本当にありがとうございました。

関連するQ&A

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLを教えてください。

    以下に5つのテーブルがあるとします。 (1)全体テーブル  ・登録順番号(Key)  ・登録名 (2)商品テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・品名 (3)商品単価テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・登録順番号(Key)  ・商品単価 (4)新_商品単価テーブル  ・項目コード(Key)  ・品名コード(Key(Key))  ・商品登録順番号  ・商品サイズ(Key)  ・登録順番号(Key)  ・新_商品単価 (5)詳細テーブル  ・登録順番号(Key)  ・品名コード(Key)  ・原価項目コード(Key)  ・商品数量A  ・商品数量B 上記のテーブルから、以下の条件に合致する「(1)の登録名」「(2)の品名」「(4)の新_商品単価×(5)の商品数量※」を取得したい。 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 【条件1】全てAND条件 新_商品単価テーブルの項目コードが100  新_商品単価テーブルの品名コードが50 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※<0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 上記で抽出出来るレコードに加えて、以下 【条件2】全てAND条件 新_商品単価テーブルの項目コードが200~300あるいは400~500 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※=0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A どのようなSQLで抽出できますでしょうか?? DBはAccessです。

  • Access クエリ抽出条件の「Between」の記述で

    こんにちは。Access2000を使用しています。 「抽出条件」フォーム上のテキストボックス "txt開始コード"と"txt終了コード"の入力条件を 「抽出」選択クエリの抽出条件として Between [forms]![抽出条件][txt開始コード] And [forms]![抽出条件][txt終了コード] 記述しました。 抽出条件は「業務データ」テーブルの"業務コード" に対応しており、「業務コード」はテキスト型長さ4 で定義してありますが、「0000」~「9999」の数値 が格納されています。また、フォーム上のテキストボックスの書式は「0000」としています。 条件を何も入力しない時はデータを抽出しますが、条件 を指定すると何も抽出されなくなってしまいます。条件 の指定を、 Between '[forms]![抽出条件][txt開始コード]' And '[forms]![抽出条件][txt終了コード]' のようにシングルクォーテーションで囲んでもうまくいき ません。文字列なのに数値が入っているのでアクセス側で 自動認識しうまくいかないのか、検討がつきません。 どなたか解決策をお願いいたします。

  • 抽出した行数を変数に入れたい(オラクルSQL)

    SELECTで抽出した行数を変数に格納したいのですが、上手くいきません。 SQLにあまり経験がなく、ネットで調べながら実践しております。 例えば以下の簡単なSQLを作ったとして、 ---------------------------------------------------- SELECT a,b,c,d,e,f FROM table WHERE c=10 AND e=20; ---------------------------------------------------- ここで抽出した行数を取得し、それを変数に入れたいと思っております。 というのも、後々、抽出したデータの行数を表示したい場合に SELECT COUNT(*) FROM table WHERE c=10 AND e=20; というSQLをその都度入力していては非効率だと思ったからです。 そこで抽出する際に行数を取得し、それを変数に格納して、 行数を表示する処理が今後必要になった際に、その変数を表示すれば良いと考えました。 ですがネットで変数のことを調べた際に VARやDEFINE等のコマンドを見つけましたが、SQLを実行しても上手くいきません。 最初に記載したSQLに、どのような構文を入れたら良いのでしょうか。

  • エクセル 抽出

    Sheet1に コード番号 商品名 数量 単価 12345    チョコ   1  50 67891    アイス   1  60 45612    アメ    1  70 と上記のようにデータがあるときにSheet2でコード番号だけ打ち込めば商品名・数量・単価を出せる関数等あれば教えてください。 宜しくお願い致します。

  • 「・」中点が入った文字列を条件にするとデータを抽出できないです

    「・」中点が入った文字列を条件にすると データを抽出できないです。 うまくいかない例 ------------------------------------------- $name = "春・春・春"; $Sql = "SELECT * FROM TestList"; $Sql .= " WHERE SpName = '".$name."'"; ------------------------------------------- 条件を変数に格納してSQL文に渡すと何も抽出できません。 しかし↓のようにSQLに直に「春・春・春」とすると うまくデータが抽出されます。 うまくいった例 ------------------------------------------- $Sql = "SELECT * FROM TestList"; $Sql .= " WHERE SpName = '春・春・春'"; ------------------------------------------- また「・」中点がない条件では変数で渡しても データがうまく抽出されます。 どうしたら「・」中点が入っている条件を 変数に格納してSQLに渡しても うまくデータが抽出されるでしょうか? どなたかご教示いただけますと助かります。 よろしくお願いします。

  • SQLストアド INSERTの質問です

    仕入データから、最後に仕入した商品毎の単価をテーブルにINSERTしたい 仕入日  商品コード   単価  数量  金額 5/1      001      150    1   150 5/2      002      160    1   160 5/3      001      145    1   145 5/4      001      146    1   146 5/20     002      170   1    170 上記のような仕入データから商品コード単位の最終@の テーブルを作成したと思います 商品コード   最終仕入@ 001        146 002        170 宜しくお願い致します

  • SQLでの複数検索条件の書き方を教えて下さい。

    SQLを使うことが初めての、本当にど素人です。 質問の仕方自体おかしいかもしれませんが、どなたか下記条件でデータ抽出するSQLの書き方を教えて下さい。 【抽出条件】 1つの商品購入テーブルから、5月と6月に購入してて、7月と8月に購入していない、東京都と神奈川県在住の方の顧客IDと購入商品すべてを抽出できないでしょうか? カラムは、顧客ID、購入月、顧客都道府県、商品コードとそれぞれ分かれています。 この内容で、ご回答いただけますでしょうか? 何卒よろしくお願いします。

  • SQLの条件文

    以下のデータで、dataで始まり、かつ数値部分を100~300の範囲で抽出したいと考えています。 テーブル名はtable1、フィールド名はretuです。 -retu- data023 unknowndata data105 data203 data827 SELECT retu FROM table1 WHERE retu LIKE 'data%' AND CAST(RIGHT(retu,3) AS Int) BETWEEN 100 AND 300 上記のSQLを作ってみたのですが、これだとunknowndataに対してCASTが行われてしまうらしく、CASTが失敗してデータを取り出すことができませんでした。 正しくデータを取り出すためには、どのように記述すれば良いでしょうか?

  • PL/SQL での[CURSOR]の記述について

    CURSORを使用する際に、以下のようなことが実現できるものか分からないもので、 ご質問させていただきました。 以下のような記述で、where条件を別の変数(wk_where)に格納しておいて、 それを連結させることが可能なのかお教えいただきたいです。 もしも可能であればどのように連結させるのでしょうか? CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル ; イメージとしては以下のように考えていました。 CURSOR cur出力データ IS SELECT AAA, BBB FROM AAAテーブル & wk_where ; 以上ですが、宜しくおねがいいたします。