• 締切済み

横並びのコード管理を別テーブルからコードと名称を取得するには?

例えば、 [品物管理テーブル] cd:name 01:スナック菓子 02:ジュース 03:アイス 04:ガム  ・ 99:その他 と [店舗別売り上げランキング管理テーブル] shop:no1:no2:no3 A店: 03: 01: 04 B店: 01: 02: 04 C店: 02: 01: 03 D店: 02: 01:null があった場合に A店の売り上げ順に[品物管理テーブル]のcdとnameを取得したい場合は どのようにすればよいのでしょうか? SELECT cd, name FROM [商品管理テーブル] AS syo LEFT JOIN [店舗別売り上げランキング管理テーブル]AS ran ON syo.cd=ran.no1 OR syo.cd=ran.no2 OR syo.cd=ran.no3 WHERE ran.shop='A店'; とすると、ランキングを無視して[品物管理テーブル]の順で 01:スナック菓子 03:アイス 04:ガム と返ってきてうまくいきません。

みんなの回答

  • baunce
  • ベストアンサー率66% (2/3)
回答No.2

品物管理テーブル・・・・t1 店舗別売り上げランキング管理テーブル・・・t2 とします。 以下でどうでしょうか? select shop,no as 店内順位,cd,name from ( select shop,1 as no,no1 as rk from t2 union all select shop,2 as no,no2 as rk from t2 union all select shop,3 as no,no3 as rk from t2 ) as v left join t1 on v.rk = t1.cd order by shop,no

ramen41201
質問者

お礼

連絡が遅くなり済みません。 baunceさんの回答で、うまく取得することが出来ました。 ありがとうございました。

回答No.1

ここはPostgreSQLのカテゴリなのですが、使用しているRDBMSは合っていますか? 表名、列名などが予約語と一緒だったり、特殊文字を含んでいる場合でも名称として使用できるように [テーブル1] [カラム1] といった囲み方をするのは、SQL ServerやMS-ACCESSなど、マイクロソフト製品の独自仕様なのですけど? 具体的なSQLを提示する上で、便宜上、囲っているだけですか? >ランキングを無視して[品物管理テーブル]の順で 「ランキング順で返して」とSQLで指定していないのですから、返って来る順序は不定(RDBMSの内部処理や物理的な格納位置などによって、どうなるか分からないし、RDBMS側で保証もされない)です。 これは、標準SQLの規格上もそうだし、殆どのRDBMSによる実装でも同じです。 返って来る順序を保証させたいなら、「order by」で明示的に指定してください。

ramen41201
質問者

お礼

早々の回答ありがとうございました。 テーブルを[]で括っているのは、テーブルとカラムを分かりやすく分けたかっただけです。 また、ORDER BYは試しましたが、希望する戻り値ではありませんでした。 SELECT cd, name FROM [商品管理テーブル] AS syo LEFT JOIN [店舗別売り上げランキング管理テーブル]AS ran ON syo.cd=ran.no1 OR syo.cd=ran.no2 OR syo.cd=ran.no3 WHERE ran.shop='A店' ORDER BY ran.no1, ran.no2, ran.no3;

関連するQ&A

  • 累積テーブルへのバックアップ方法について

    OracleでのデータバックアップをSQLにて作成しようとしています。 【処理内容】 売上テーブル(URITBL)から売上累積テーブル(URIRUITBL)へ  ※売上年月がシステム日付より12カ月以上前(2010年8月以前) AND 領収済みのものを   売上テーブルから売上累積テーブルへ追加し、   売上テーブルにあったデータは削除する 売上明細テーブル(URIMTBL)と売上明細累積テーブル(URIRUIMTBL)へ  ※売上年月システム日付より12カ月以上前(2010年8月以前) AND 領収済みのものを   売上明細テーブルから売上明細累積テーブルへ追加し、   売上明細テーブルにあったデータは削除する 【テーブル内容】 売上テーブル(URITBL)更新前  支店CD、顧客NO、売上年月、氏名、TEL、領収済フラグ(※領収済…'1'、領収未…SPACEです)  STNCOD、KKKNO、URIYM、NAME、TEL、RYOFLG  001    000012  201006  A田太郎  123-1234   1  001    000012  201007  A田太郎  123-1234      001    000012  201008  A田太郎  123-1234   1  001    000012  201009  A田太郎  123-1234   1  001    000012  201010  A田太郎  123-1234   1  002    000101  201006  B田二郎  345-5678     002    000101  201007  B田二郎  345-5678   1  002    000101  201008  B田二郎  345-5678   1  002    000101  201009  B田二郎  345-5678    002    000101  201010  B田二郎  345-5678   1 売上明細テーブル(URIMTBL)更新前  支店CD、顧客NO、売上年月、売上金額  STNCOD、KKKNO、URIYM、URIKIN  001    000012  201006    1,000  001    000012  201007    2,000  001    000012  201008    3,000  001    000012  201009    4,000  001    000012  201010    5,000  002    000101  201006    500  002    000101  201007    1,500  002    000101  201008    2,500  002    000101  201009    3,500  002    000101  201010    4,500 売上テーブル(URITBL)更新後  支店CD、顧客NO、売上年月、氏名、TEL、領収済フラグ  STNCOD、KKKNO、URIYM、NAME、TEL、RYOFLG  001    000012  201007  A田太郎  123-1234     001    000012  201009  A田太郎  123-1234   1  001    000012  201010  A田太郎  123-1234   1  002    000101  201006  B田二郎  345-5678     002    000101  201009  B田二郎  345-5678     002    000101  201010  B田二郎  345-5678   1 売上明細テーブル(URIMTBL)更新後  支店CD、顧客NO、売上年月、売上金額  STNCOD、KKKNO、URIYM、URIKIN  001    000012  201007    2,000  001    000012  201009    4,000  001    000012  201010    5,000  002    000101  201006    500  002    000101  201009    3,500  002    000101  201010    4,500 売上累積テーブル(URIMTBL)更新後  支店CD、顧客NO、売上年月、氏名、TEL、領収済フラグ  STNCOD、KKKNO、URIYM、NAME、TEL、RYOFLG  001    000012  201006  A田太郎  123-1234   1  001    000012  201008  A田太郎  123-1234   1  002    000101  201007  B田二郎  345-5678   1  002    000101  201008  B田二郎  345-5678   1 売上明細累積テーブル(URIMRUITBL)更新後  支店CD、顧客NO、売上年月、売上金額  STNCOD、KKKNO、URIYM、URIKIN  001    000012  201006    1,000  001    000012  201008    3,000  002    000101  201007    1,500  002    000101  201008    2,500 売上テーブル(URITBL)から売上累積テーブル(URIRUITBL)へ追加のSQL、売上テーブル(URITBL)の削除のSQLは以下の2つではないかと思います。   INSERT INTO URIRUITBL SELECT * FROM URITBL WHERE RYOFLG='1' AND ( URIYM < ADD_MONTHS (SYSDATE, -12) ) ; DELETE FROM URITBL WHERE RYOFLG=1 AND ( URIYM < ADD_MONTHS (SYSDATE, -12) ) ; ただ、売上明細テーブル(URIMTBL)と売上明細累積テーブル(URIRUIMTBL)へ追加のSQL、売上累積テーブル(URIMTBL)の削除のSQLはどうやってコーディングしたら良いのか悩んでいます。上記と同じように作っていくので大丈夫なのか、それとも別関数を使って作っていくのか、SQLの本などを半日ほど費やして調べてるのですが、いまだ至っておりません。最悪な時は別プログラムでとも考えているのですが、納期間近でできればSQLで解決したいと思いながら苦戦しています。 以前もこちらで教えて頂いてるのでたびたびの質問で恐縮ですが、分かる方がいれば手助けして頂きたいと思い、今回投稿しますのでご教授賜りたく思います。よろしくお願いします。

  • ドメイン情報管理テーブル作成の仕方

    ◆やろうとしていること 現在エクセルで管理している40個ほどのドメイン情報を、Webで管理(検索・更新・削除)する簡易システムをデータベースとPHPの勉強をかねて構築しようとしています。 ※環境は、LAMPで構築しようとしております。 ◆知りたいこと ドメイン情報管理テーブルを作ろうとしているのですが、その作成の仕方について、アドバイスしていただけたらと思っています。(正規化の方法??) ◆疑問点 管理対象のドメイン情報は、重複が多いデータです。 ・同一のネームサーバで複数のドメインを管理している ・同一の業者が複数ドメインのレジストラとなっている ・同一の担当者が複数案件の担当者となっている ・同一IDで複数ドメインの管理を行っている たとえば、次のような感じです。 例) ドメイン名      レジストラ      ネームサーバ 案件担当者  ID        案件情報            hoge.com お名前.com    ns.bbb.jp 東京一郎  a0002 自社ECサイト hoge.jp     お名前.com       ns.bbb.jp   東京一郎  a0002  自社コーポレイトサイト test.jp さくらインターネット ns.bbb.jp   京都一郎  a0003 あいう社コーポレイトサイト aaa.jp さくらインターネット ns1.bbb.jp  大阪一郎  a0004  かきく社コーポレイトサイト aaa.net ムームードメイン ns1.bbb.jp  東京一郎  a0005 さしす社blogサイト bbb.net ムームードメイン ns1.bbb.jp  東京一郎  a0005 たちつ社ECサイト  現在、エクセルで上記のような情報を管理しています。 これを初学者の私なりに正規化してみると ・ドメインリストテーブル(主キーとドメイン名だけが入っているテーブル) ・案件担当者リストテーブル(主キーと案件担当者だけが入っているテーブル) ・レジストラリストテーブル(主キーとレジストラだけが入っているテーブル) ・ネームサーバリストテーブル(主キーとネームサーバだけが入っているテーブル) ・IDリストテーブル(主キーとIDだけが入っているテーブル) ※各テーブルの主キーは、ドメインリストテーブルの主キーを設定 と、知識と経験が無いため、テーブルをいちいち細かくすることしかできないのです。 そこで、このようなデータを管理するテーブルを作る場合の一般的な考え方・注意事項・コツ・ポイントなどを踏まえアドバイスをいただけたらと思い質問いたしました。 具体的に、俺だったら、こういうテーブルに分割してドメイン情報を管理する。その理由は云々、といったかたちでアドバイスいただけますと大変助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • PL/SQLでUPDATE別テーブル条件を付加する

    PL/SQLでUPDATEする際、別のテーブルからの条件も付加し更新を行いたいのですが、可能でしょうか? 教えて下さい。 どうぞよろしくお願い致します。 テーブル名T_NAMEのSEI='1'の時以下のロジック処理を行いたいのです。 UPDATE T_ADRS SET DLT_FLG = '1' , USER_ID = inUSER_ID , TNMT_ID = inCOMP_ID , UPD_DT = SYSDATE WHERE RTRIM(ADR_CD) = RTRIM(strADR_CD) AND RTRIM(DATA_SY) = RTRIM(strDATA_SY) AND RTRIM(IMP_NO ) = RTRIM(strIMP_NO );

  • データの取得方法

    Aテーブル{ id char(3) not null, name varchar(10), a_no char(5), b_no char(5), c_no char(5), date timestamp } Bマスタ{ no char(5), name char(10) } 上記のようなDBがあるのですがAテーブルのa_no、b_no、c_noに入るのはBマスタのnoになります。 下記のようにデータを取得したい場合、どうすればうまく取得できるのでしょうか。 A.id, A.name, A.a_no, カラム名をname1としてB.name, b_no, カラム名をname2としてB.name, c_no, カラム名をname3としてB.name そんなに難しいことではないと思うのですが、考えれば考えるだけ頭の中でこんがらがってきて困っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブル結合方法について

    MySQL5.1で、Table a ,Table b から、Table cのように取り出したいのですが、 SQLでSELECTする方法がわかりません。 Table b優先だけど、Table aにしかデータがない場合もあるといった感じです。 Table a No  Name 1 加藤 2 佐藤 3 田中 Table b No Name 2 佐藤先輩 4 田辺先輩 Table c No Name 1 加藤 2 佐藤先輩 3 田中 4 田辺先輩 どうか、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Accessでクエリを作った際の順番

    Access2003の質問です。 以下のテーブルがあってそれらの項目を抜き出してクエリを作っています。 テーブル1 ・商品CD ・商品名 ・単価 テーブル2 ・No ・売上日 ・得意先CD ・商品CD ・数量 テーブル3 ・得意先CD ・得意先名 ・フリガナ ・郵便番号 ・住所 ・TEL ・担当者CD ・DM テーブル4 ・担当者CD ・担当者名 クエリ ・No(テーブル2) ・売上日(テーブル2) ・得意先CD(テーブル2) ・得意先名(テーブル3) ・担当者CD(テーブル3) ・担当者名(テーブル4) ・商品CD(テーブル2) ・商品名(テーブル1) ・単価(テーブル1) ・数量(テーブル2) クエリを作って、データシートビューに切り替えるとなぜか得意先CDで昇順に並んでいます。 もちろんNoで並べ替えを設定すれば、Noで並べ替わるのですが、なぜ得意先CDで昇順に並ぶのでしょうか? Noが一番左にあるので、Noで並べ替わりそうなものですが・・ 何も並べ替えを設定しないとどのような基準で並ぶのでしょうか? わかる方がいれば教えてください。

  • Cakephpでランキング機能の作成方法について。

    Cakephpでランキング機能の作成方法について。 Cakephpで、お気に入り数順のランキング機能を作りたいと考えています。 以下のような構造でランキングを表示させたいのですが、 やり方が分からず困っています。 ■システム概要 コーヒーの紹介サイトです。 様々なコーヒーが登録されており、ユーザーは任意のコーヒーをお気に入り登録できます。 Coffeeテーブル id , name Userテーブル id , name Favoriteテーブル id , coffee_id , user_id 現在、ランキングを表示させたいページであるindex.ctpには、$this->Coffee->find();でCoffeeの情報を表示させています。 アソシエーションでUserテーブル、Favoriteテーブルの情報も取れていますが、これをお気に入り数順にソートするやり方がわかりません。宜しくお願いします。

    • ベストアンサー
    • PHP
  • テーブルデータの絞込み条件

    MySQL4.1、PHP Version 4.3.9を使用しています。 下記のような2つのテーブルA,Bから テーブルAに存在するキー(no)のデータのみ取得したいのですが、 どのようにWHERE文を書いたら一回のSQL文で取得出来るのでしょうか。 テーブルA no |name 1 |たろう 2 |はなこ 3 |じろう テーブルB no |old 1 |16 3 |18 取得したい結果テーブル no |name 2 |はなこ 良い方法が見つかりません。 宜しくお願いします。

  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

  • Oracle[10g]のSQL文について

    ごぶさたしております。Oracle[10g]のSQL文についての 質問です。(No.???) [A]テーブルに [CODE](KEY) [CODE2] [NAME] のフィールドがあります。 A-1 B-1 NAME-1 A-2 B-2 NAME-2 A-3 B-3 NAME-3 [B]テーブルに [CODE2](KEY) [NAME-B] のフィールドがあります。 B-1 NAME-B-1 B-2 NAME-B-2 B-3 NAME-B-3 [C1]テーブルに [NO](KEY) [LINE](KEY) [CODE] のフィールドがあります。 X 1 A-1 Y 1 A-2 [C2]テーブルに [NO](KEY) [LINE](KEY) [LINE2](KEY) [BIKO] のフィールドがあります。 X 1 1 BIKO-1 X 1 2 BIKO-2 Y 1 1 BIKO-3 結果が [NO/LINE/LIN2/NAME-B/BIKO] X 1 1 NAME-B-1 BIKO-1 X 1 2 NAME-B-1 BIKO-2 Y 1 1 NAME-B-2 BIKO-3 と、なる様にしたいのです。問題は、[B]テーブルです。 今まで、教えていただいた事を参考に頑張ってみましたが、 思う結果がでません。宜しくお願い致します。