同一テーブル内での比較(2つの条件での比較)

このQ&Aのポイント
  • 商品毎に異なる商店の価格差を大きい順にソートする方法について教えてください。
  • SQL分を使用して、商品毎に商店1とそれ以外の商店の価格差を求めることができます。
  • 希望の出力結果は、価格差、商品名、商店の順で表示される形式です。
回答を見る
  • ベストアンサー

同一テーブル内での比較(2つの条件での比較)

大変申し訳ありません。ほかにも似たようなのがあるのですが、応用が利かずわかりませんので、ご教授頂けると幸いです。 以下のようなテーブルがあり、価格が異なるところを差額一覧を出したいと思っております。 【テーブル構成】 商品ID、商店ID、価格(円) というテーブルがあり、 商品A、商店1、1000 商品A、商店2、1500 商品A、商店3、800 商品B、商店1、2000 商品B、商店2、1700 商品B、商店3、2600 ・・・(多くの商品データがあります) というデータが格納されております。 商店1を基準に、商品毎に商店2、3の価格差を大きい順にソートして出したいと考えています。 SQL分ではどのように記載すれば良いでしょうか? (今回の場合の希望出力が以下のような感じです。) 価格差、商品名、商店 (←これは当然、出力されない) 600、商品B、商店3 500、商品A、商店2 -200、商品A、商店3 -300、商品B、商店2 ご教授頂けると幸いです。

  • MySQL
  • 回答数2
  • ありがとう数10

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.2

「商品ID」カラムの値が「商品A」や「商品B」で、「商店ID」カラムの値が「商店1」や「商店2」なのでしょうか? 少し違和感が有りますが、それは置いておいて・・・。 「商店1」以外の行を、同じ商品IDの「商店1」の行と結合して、価格の差を取れば良いかと。 例) ------------------------------------ SELECT a.価格 - b.価格 AS 価格差, a.商品ID AS 商品名, a.商店ID AS 商店 FROM 対象テーブル a INNER JOIN 対象テーブル b ON (a.商品ID = b.商品ID AND b.商店ID = '商店1') WHERE a.商店ID <> '商店1' ORDER BY a.価格 - b.価格 DESC; ----------------------------------------

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/join.html
yamakiyo2
質問者

お礼

解説付きで助かりますし、よくわかりました。 きっちり出てきました。早々の回答、ありがとうございます。 ありがとうございました。

その他の回答 (1)

回答No.1

こんな感じでどうでしょう。 select t2.価格-t1.価格 as 価格差 ,t1.商品名 ,t1.商店 from テーブル1 as t1 left join ( select 価格,商品 from テーブル1 where 商店=商店1 ) as t2 on t1.商品 = t2.商品 where t1.商店<>商店1

yamakiyo2
質問者

お礼

さすがです。きっちり出てきました。 早々の回答、ありがとうございます。あとは順序をつければOKですね。 ありがとうございました。

関連するQ&A

  • 同一テーブル内での比較(最新データによる比較)

    大変申し訳ありません。本日も質問させてもらったのですが、一部情報(履歴)が不足していて追加で質問させてください。 以下のようなテーブルがあり、価格が異なるところを差額一覧を出したいと思っております。 (先ほどは2名の方に回答頂き、すみませんベスト10の設定がわからず設定できなくて、すみませんでした。) 【テーブル構成】 商品ID、商店ID、価格(円)、履歴 というテーブルがあり、 商品A、商店1、1000、1 商品A、商店2、1500、1 商品A、商店3、800、1 商品A、商店1、2000、2 商品A、商店2、2500、5 商品A、商店3、1800、3 商品B、商店1、2000、1 商品B、商店2、1700、1 商品B、商店3、2600、1 商品B、商店1、2500、4 商品B、商店2、2000、6 商品B、商店3、2800、7 ・・・(多くの商品データがあります) というデータが格納されております。 商品と商店の区分ごとに履歴の最も大きいものを取り出し (←追加) 商店1を基準に、商品毎に商店2、3の価格差を大きい順にソートして出したいと考えています。 SQL分ではどのように記載すれば良いでしょうか? (実際に比較したデータは以下を抽出し)【履歴の古いのは無視】 商品A、商店1、2000、2 商品A、商店2、2500、5 商品A、商店3、1800、3 商品B、商店1、2500、4 商品B、商店2、2000、6 商品B、商店3、2800、7 ・・・(多くの商品データがあります) (今回の場合の希望出力が以下のような感じです。) 価格差、商品名、商店 (←綱目です。) 800、商品B、商店3 500、商品A、商店2 -200、商品A、商店3 -500、商品B、商店2 ご教授頂けると幸いです。 ちなみに、教えて頂いたSQLをもとに以下のようにやってみましたが、うまくいきませんでした。。。 全くよくわかっていません。少し解説を入れて頂けると幸いです。 ------------------------------------ SELECT a.価格 - b.価格 AS 価格差, a.商品ID AS 商品名, a.商店ID AS 商店 FROM 対象テーブル a INNER JOIN 対象テーブル b ON (a.商品ID = b.商品ID AND b.商店ID = '商店1') WHERE a.商店ID <> '商店1' AND a.履歴 = (SELECT MAX(a.履歴)) AND b.履歴 = (SELECT MAX(b.履歴)) 【←追加】 ORDER BY a.価格 - b.価格 DESC; ---------------------------------------- select t2.価格-t1.価格 as 価格差 ,t1.商品名 ,t1.商店 from テーブル1 as t1 left join ( select 価格,商品 from テーブル1 where 商店=商店1 ) as t2 on t1.商品 = t2.商品 where t1.商店<>商店1 AND a.履歴 = (SELECT MAX(a.履歴)) AND b.履歴 = (SELECT MAX(b.履歴)) 【←追加】 ORDER BY t2.価格 - t1.価格 DESC;

    • ベストアンサー
    • MySQL
  • 条件付ソートについて

    SQL文で条件付のソートについて教えてください。 テーブルA(id, data_a, data_b)があったとき、 data_aとdata_bのうち、値が大きいほうのデータでソートするためのSQL文が知りたいのです。 例えば以下のようなデータが入っていたとき、 id,date_a,date_b 1, 10, 0 2, 20, 40 3, 30, 30 4, 90, 15 以下のような結果になるようにソートしたいのです。 id,date_a,date_b 1, 10, 0 3, 30, 30 2, 20, 40 4, 90, 15 良い方法があれば教えてください。 よろしくお願いします。

  • 2つのテーブル結合

    Oracle10g使用しています。 テーブルAとテーブルBを結合させてデータを取得したいと思っています。 [テーブルA] ID name 1 A 2 B 3 C 4 D [テーブルB] ID SEQ VALUE 1 1 111 2 1 222 2 2 333 3 1 444 4 1 555 4 2 666 4 3 777 テーブルAのキーは[ID]、テーブルBのキーは[ID,SEQ]です。 この二つを連結して以下のように出力したいと思っています。 ID SEQ NAME VALUE 1 1 A 111 2 2 B 333 3 1 C 444 4 3 D 777 テーブルBのデータは同じIDのうち最大のSEQのものを取得したいのですが よいSQLが思いつきません。 よい方法があればご教授ください。 よろしくお願いいたします。

  • ピボットテーブルのデータフィールドの編集

    販売店とそのお店で売れた商品の個数を集計しています。普通にテーブルを作成したところ 店名   データ     集計 A商店  合計/商品1  100       合計/商品2  200 B商店  合計/商品1   50       合計/商品2  140 となりました。ただ店数が多く、商品数が少ないためできれば 店名  データ     集計  データ    集計 A商店 合計/商品1 100 合計/商品2 200 B商店 合計/商品1  50 合計/商品2 140 のように、2行になっているデータフィールドを1行にまとめたい思いましたが、方法がわかりません。理想形としましては 店名  合計/商品1 合計/商品2   A商店    100    200 B商店     50    140 のようになれば行数が少なく済むので、レポートを出力するのに枚数も少なくなり都合がいいです。 1列2行のデータフィールドを1行2列に変換する方法をご存知の方、ご教授ください。

  • Aテーブルの条件でBテーブルから抜き出し

    すみません。大変困っています。 SQL文で Aテーブル、Bテーブルがありまして、 A.id = B.idがリレーションしています。 Aテーブルから、Bテーブルのidが無いデータだけを 取り出したいのですが、どういった例が考えられますでしょうか?よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 2つの条件をデータテーブルに照らし合わせデータを抽出する

    2つの条件をデータテーブルに照らし合わせデータを抽出する 品番  顧客ID  価格 35894  312    A 35894  635    B 35895  215    C 別のシートに下記の価格表があります。 品番   312    215     635 35894  12,000  13,000   14,000 35895  5,000   6,000     7,000 価格欄のA, B, Cに入力すべき数式はどうなるでしょうか。 A=12,000 B=14,000 C=6,000 と表示されるのが求めている結果です。 どなたか教えて下さい。 IFとINDEXとMATCHを使って6つの顧客IDまでなら実現できましたが 顧客数は約50ありますので行き詰まりました。

  • フォームから2つのテーブルにデータを書き込みたい

    Accessで T_aテーブルとT_bテーブルがありそれぞれのフィールドが以下のようになっているとします。 T_a:フィールド名 データ型    ID  オートナンバー型    商品番号 テキスト型 主キー T_b:フィールド名 データ型    ID  オートナンバー型 主キー    商品番号 テキスト型 このときフォームから入力したデータをそれぞれのテーブルの商品番号に追加したいのですがどのようにすればよいのでしょうか。  よろしくお願いいたします。

  • accessで2つのテーブルから参照する方法

    access2007を使っています。 例えば、 テーブルA ID   品名   価格 A1   鉛筆    100円 テーブルB ID   品名   価格 B1  消しゴム  50円 というレコードが2つあった場合 テーブルAとテーブルBのどちらからも参照して ID  品名   価格 A1  鉛筆   100円 B1  消しゴム  50円 というふうにクエリにデータを反映させるのにはどうすれば良いのでしょうか?  

  • テーブルごとのカウント

    PHP5.2+mysql 5.0.45で開発を行っております。 SQLに関する質問なのですが 以下のことが可能かどうかご教授いただきたく。 4つのテーブルがあります。 (例は適当です。項目の名称等は無視してください。) テーブルA ID Name Kana テーブルB ID NameID Pref City テーブルC ID NameID Tel Fax テーブルD ID NameID email CellPhone とします。 A.ID=1000の時各テーブルのレコード数が A:B:C:D=1:3:2:2となっています。 SQLの出力結果として A.ID A.Name A.Kana B.Count(ID) C.Count(ID) D.Count(ID) という、6項目を出力したいのですが 方法がわかりません。 試してみたのは select A.ID,A.Name,A.Kana,Count(B.ID),Count(C.ID),Count(D.ID) from A left join B on A.ID = B.NameID left join C on A.ID = C.NameID left join D on A.ID = D.NameID where A.ID = 1000 group by A.ID,A.Name,A.Kana ですが 結果、 A.ID = 1000 A.Name = Name A.Kana = Kana Count(B.ID) = 3 Count(C.ID) = 3 Count(D.ID) = 3 となってしまいます。 冷静に考えるとそうなんですが・・・ もしうまく結果を取得できる方法があればご教授いただきたく よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 2つのテーブルの列を比較し易いよう表示させたい

    2つのテーブルがあるとします。 Aテーブル (住所列) 東京 神奈川 千葉 茨城 Bテーブル (住所列) 神奈川 千葉 茨城 このAとBテーブルでは同じ項目(住所列)をもっておりますが、 存在するデータは異なっております。 このAとBのテーブルの結果を以下の様に抽出したいのですが、 どのようなSQLを組めば良いでしょうか? A.住所 B.住所 東京   (歯抜けにしたい) 神奈側 神奈川 千葉 千葉 茨城 茨城 ご教授お願いします。