• 締切済み

検索結果の列数を動的に変更したい

お世話になります。以下のようにデータ検索するテクニックをご教授ください。 (1) 商品マスタ(商品コード、商品名)の状態 A,ラーメン B,カツ丼 C,カレー (2) 消費テーブル(氏名、商品コード)の状態 田中,A 田中,B 田中,C 林,B これらのデータを元に以下のようにデータを取得。 A.氏名を「田中」で条件指定 → 田中,ラーメン,カツ丼,カレー B.氏名を「林」で条件指定 → 林,カツ丼 ポイントは (1)消費テーブルには、氏名ごとに複数レコード存在するが、それらを1レコードにまとめる (2)条件に応じて、列数を動的に変える 表現が稚拙で恐縮ですが、よろしくお願いします。

みんなの回答

回答No.2

SQL Serverのバージョンは? 列数を可変というのが、実際に最大何列くらいになるのかにもよりますが。 ぱっと思いついたままを書くと、 (1)最大列数を固定にし、くっつける行がない場合は、''(長さが0の文字)をくっつけるといった方法を使えば、シンプルに実現できるかも知れません。 (2)いろいろな要件を満たすには、ストアドプロシジャでやる (3)可能な限り「SQLだけ」で実現したいなら、SQL Server 2005以降であれば、WITH句で再帰クエリを行いながら、列値を連結していくといった方法も考えられます。

takumin2004
質問者

補足

3rd_001さん、chukenkenkouさん 早速のご回答ありがとうございました。 SQLServerのバージョンは 2008で、最大列数は10程度を想定しています。 出来るのであればテーブル型関数で実装して、呼び出し側からはシンプルに SELECT * FROM function_name(氏名) を発行することで、可変の列数を取得したい、と考えています。 まあ、要件が満たせられればテーブル型関数には拘りませんが・・・ いろいろなご提案をいただき、ありがとうございます。 上述の要件を満たすには、どのチョイスが実装し易そうでしょうか。 (技術レベルが低くて恐縮です。簡単な例をいただけると助かります)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.1

縦横変換でよくあるパターンですが、動的というのがどこまでかにもよります。 ※無限というわけにはいきません。 単純なSQLですとCASE文とGroupByで対応可能ですが、あくまでCASE文を指定する数だけしか対応できません。 本当に不定(10や20ではきかない)ならは氏名でループして【商品コード】【商品名】を連結していく処理を実装したほうが良い気がします。 これをDBのストアドプロシージャでやらせるか、クライアント側でやらせるかは要件しだいです。 自分でなら配列を連結させるような共通関数を作ってクライアントでやらせます。

takumin2004
質問者

補足

3rd_001さん 早速のご回答ありがとうございました。 chukenkenkouさんの補足に記載させていただきましたが、 簡単な例をいただけると幸いです。よろしくお願いします。

関連するQ&A

  • Access 選択クエリでAND検索

    現在、フォーム1にはリストボックスが3つあり、それぞれ食べ物の区分に分かれており、それぞれのリストボックスに食べ物の種類が表示されています。 区分は、麺類、肉系、ご飯系と分かれており、 それぞれの、ラーメン、冷やし中華、焼き肉、しゃぶしゃぶ、カツどん、カレーライス等と入力されています。 そして、それぞれのリストボックスで選択した項目は、[表示]ボタンを押すことでテーブル1に値が保存されるようになっています。 そして、現在、テーブル1には、下記のように、食べ物の種類が入力されています。 テーブル1 ---------- 焼き肉 ---------- ラーメン ---------- カレーライス ---------- そして、別のテーブル2には下記のように、マスターテーブルとしてそれぞれの名前と好きな食べ物の種類が入力されています。 佐藤|焼き肉|カレーライス 鈴木|ラーメン|カレーライス 田中|焼き肉|ラーメン|カレーライス (構造) 名前ID テキスト型 FoodID 数値型 (実データ) NameID FoodID 佐藤  1 佐藤  3 鈴木  2 鈴木  3 田中  1 田中  2 田中  3 上記のテーブル1とテーブル2を比較し、選択クエリで抽出させると、焼き肉、ラーメン、カレーライスを含む社員を抽出するため、佐藤、鈴木、田中の全員が抽出されてしまいます。 これを、焼き肉、ラーメン、カレーライスの3つすべてを好きな人を抽出させたいと思っています。 (結果は、田中となるようにしたいです。) ちょっと分かりづらいかもしれませんが、 上記のようにすべてを含む人を抽出させるにはどのようにしたらよいでしょうか? 宜しくお願いします。

  • エクセル2000で複数の検索条件検索・・・

    このような表があります。 入金日 氏名 商品A 商品B 商品C 1/1  山田  200   100  50 1/2  山田       50  50  1/1  田中  100   50   30 1/3  川口  100   20   20 1/4  川口  100   600  10 のような表が延々と続くわけですが、この表から 1/1売上げ 氏名 商品A 商品B 商品C 計 田中 川口 山田 のような表を作りたいのです、上の部分の1/1の日付の部分を入力規制のリストで日付を変えるとポンっとその日付の表計がでるようにしたいのですが、例えば田中の商品Aの項目のところに関数を入れようとしたのですが、SUMIFではだめですよね?日付が一つの条件で二つの条件が田中であることそれで商品Aの売上げ。三つの条件をいれなくては ならないのですが、もうお手上げです。 だれか何卒よろしくお願いします。

  • SQLで実現出来るものか教えてください(別途、プログラムが必要?)

    SQLで実現出来るものか教えてください(別途、プログラムが必要?) Accessで、下記の様な二つのテーブルがあります。 【テーブルA:データテーブル】 テーブルAの1レコード目~「新商品コード:001;002;999」「商品名一覧:みかん」 テーブルAの2レコード目~「新商品コード:002;003;999」「商品名一覧:いちご」 【テーブルB:新果物マスタ】 テーブルBの1レコード目~「新商品コード:001」「商品名:バナナ」 テーブルBの2レコード目~「新商品コード:002」「商品名:レモン」 テーブルBの3レコード目~「新商品コード:003」「商品名:パイン」 テーブルBの4レコード目~「新商品コード:999」「商品名:その他」 テーブルAの新商品コードに該当する商品名を、テーブルBから取得して、 テーブルAの商品名一覧に加えたいのですが、どんなSQLで出来るでしょうか? <欲しい結果> テーブルAの1レコード目~「新商品コード:001;002;999」「商品名一覧:みかん、バナナ、レモン、その他」 テーブルAの2レコード目~「新商品コード:002;003;999」「商品名一覧:いちご、レモン、パイン、その他」

  • フラグがたっているデータがあったら検索かけたい・・。

    Aテーブルにグループ番号、ID番号、氏名、ステータスフラグが格納されており、BテーブルにID番号、氏名、電話番号、住所が格納されているとします。検索したい条件は、同じグループの中で、ステータスフラグがたっているレコードが1件でもあれば、ID番号を使って、Bテーブルと結合してグループ番号でGROUP BYしてデータがとりたいのです。例えば、Aテーブルにグループ番号001のグループ番号を持つレコードが5レコードあり、そのうちステータスフラグがたっているレコードが1レコード。002のグループ番号を持つレコードが3レコードあり。ステータスフラグがたってるのが0レコードだとします。結果として、001のグループはステータスフラグがたっているレコードがあるから、検索対象になるが、002はステータスフラグがたっているレコードがないので、検索対象にならないといった具合なんですが・・・。よろしくお願いします。自分で考えたSQLは次のものです。SELECT * FROM A, B WHERE A.ID_NUMBER=B.ID_NUMBER GROUP BY A.GROUP_NUMBER HAVING COUNT(A.STATUS=1)>0 こんな感じです。ただCOUNT関数ではこれではダメみたいで・・・。まだ、1年目の新人なので、どなたかご教授お願いします。

  • Accessクエリの抽出条件

    Access2000を使用しています。 クエリの抽出条件にテーブルの値を使用したいのですが、その方法がわかりません。 テーブルAには、「日付」、「当者コード」 などの項目があります。 テーブルBの項目は「担当者コード」のみです。また、1レコードしか登録 されていません(2レコード以上になることはありません)。 そこで、テーブルAに対するデータ抽出条件を、テーブルBの「担当者」としたいのですが、 どのように記述すればよろしいでしょうか・・・? よろしくお願いします。

  • accessテーブル検索 エクセルのセルデータから

    エクセルファイル M.xlsxの セルA1(氏名)=やまだやまよ B1(生年月日)=1980/3/15 という ひらがなの氏名があるとします access H.mdbというファイルのなかの テーブルTにおいて フィールド1=氏名 フィールド2=生年月日 フィールド3=ID のテーブルがあり このテーブルTに 上記エクセルのA1の氏名が あるかどうか このケースですと やまだやまよ が このテーブルTのフィールド1の行にあるかどうか これを調べるVBAのコードを 知りたいのですが、 検索ワードが M.xlsxのセルA1 という定義でコードを御教示ください 氏名で一致したデータがあるときに そのデータのフィールド2の生年月日でもB1のデータと一致するかを 続けて検索するとします ここまでの動作のコードを 御教示願えたら 助かります 宜しくお願い致します win10 office365

  • Access2002 2つのテーブルのマージ方法

    いつもお世話になっております。 クエリについてお聞きします。 現在、2つのAccessDBが稼動しており、それを1つにまとめる作業をしています。 2つのDBには似通ったテーブルが存在し、それをマージする方法で悩んでいます。 テーブルA ・社員番号 ・社員氏名 ・フリガナ ・会社コード ・部署コード テーブルB ・従業員コード ・従業員名カナ ・従業員名 ・所属コード フィールドの定義としましては、 社員番号=従業員コード 社員氏名=従業員名 フリガナ=従業員名カナ 部署コード=所属コード となります。 全てテキストのレコードです。 これを、テーブルAを正にして、テーブルBのデータをAにマージしたいのです。 要件としましては、 1.テーブルAに存在する社員コードにマッチするレコードはそのまま残す(Bのデータは無視) 2.テーブルAに存在せず、Bに存在するものをAに追加する ということです。 クエリを使って色々試しましたが、どうしてもテーブルAに存在するものもアップデートしてしまい、困っています。 どなたかご教授願えれば幸いです。 よろしくお願いいたします。

  • レコード数をカウントしてから特定条件で検索は?

    主キー、副キーの組み合わせでレコード数をカウントして条件にあったものでかつ特定条件のレコードを出したいのですがどのようにしたらいいでしょうか? 例えば画像のようなテーブルとします。(テーブル名はTANAです) 棚コードが主キー、商品コードが副キーとしたときこの組み合わせでカウントしてレコード数が1つしかないものを抽出します。 select 棚コード, 商品コード from TANA group by 棚コード, 商品コード having count(*) = 1; をすれば 棚コードと商品コードの組み合わせで 「T1」&「OP123」 「T5」&「A7777」 が抽出できるかと思います。 この条件に加えて、担当者が「鈴木」か「山田」のものだけを拾い上げるにはどのようなSQLを書けばいいでしょうか? (例だと山田しか出てきませんが・・・) 詳しい方よろしくお願いいたします。Ora10gが対象です。

  • SQLで違うテーブルの結果を組み合わせたい

    SQLでどう結果を返したらいいのかわからないので力を貸してください。 下記の受注表と入荷表があります。 受注表 担当 商品コード 顧客コード ── ──── ───── 田中 A1 001 田中 A1 002 田中 A1 003 山田 A2 020 山田 A1 003 田中 A1 020 入荷表 担当 入荷コード 入荷日 ── ───── ───── 山田 X013 20080701 山田 X013 20080701 田中 X013 20080701 山田 X013 20080630 山田 X013 20080630 田中 X123 20080630 自分の欲しい結果を出すためのSQLは下記のクエリです。 ≪受注表テーブルから≫ SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ; SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ; ≪入荷表テーブルから≫ SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ; SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ; これらで出る結果をただ下記のように横並びに出したいのですがどうしたらよいでしょうか? 「担当」の項目に関しては複数でますが気にしないで下さい。 ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです。 担当 顧客コード 担当 顧客コード 担当 入荷日 担当 入荷日 ── ───── ── ───── ── ──── ── ───── 田中 003 田中 020 田中 20080701 田中 20080630

  • アクセスのデータ抽出

    現在テーブルA(支店コード、支店名、郵便番号、住所)とテーブルB(支店コード、社員番号、商品Aの売上数、商品Bの売上数・・・※商品名ごとにレコードを持っています。)の2つのテーブルを使っています。 これをクエリで抽出しているのですが、社員一人につきひとつのレコードしか抽出されません。 売上のない支店も全て抽出し、実績報告書として印刷するため、テーブルAとBに結合のプロパティでテーブルAの全てを選んでいるため、これ以外の方法でテーブルBのデータ全てを抽出したいのですが、何か方法はありますか?