重複データを除外して条件をつけたい

このQ&Aのポイント
  • 重複データを除外して、種別ごとに最新の入荷日付を抽出したいです。
  • MySQLバージョン4.1.21を使用していますが、group byやサブクエリを試しても期待する結果が得られません。
  • 困っているので、どなたか詳しい方に助言をいただきたいです。
回答を見る
  • ベストアンサー

重複データを除外する際に条件をつけたい

下記(A)の状態から(B)のような結果を出したくて、group by やサブクエリなどで試行錯誤しましたが、 欲しい結果が取れず困っております。 どなたかわかる方、ご教授いただけましたら助かります。よろしくお願いいたします。 (MYSQLバージョン:4.1.21) (A)  NO|入荷日付|種別|名称   3|20080730|2|りんご   4|20080801|2|りんご   5|20080728|2|りんご   8|20080801|2|りんご  10|20080812|2|りんご   7|20080811|25|ぶどう   9|20080811|25|ぶどう   1|20080731|36|みかん   2|20080728|36|みかん   6|20080808|50|いちご (B)抽出結果  NO|入荷日付|種別|名称  10|20080812|2|りんご   9|20080811|25|ぶどう   1|20080731|36|みかん   6|20080808|50|いちご ■抽出条件  ・【種別】ごとに【入荷日付】が最新のデータを1件だけ抽出。  ・ NO:7やNO:9のデータのように、【種別】と【入荷日付】が同じ場合は、【NO】が最大のデータを抽出。

  • keims
  • お礼率100% (3/3)
  • MySQL
  • 回答数2
  • ありがとう数7

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

テンポラリをつかって同じコトができますね。 考え方は全く同じです。 CREATE TEMPORARY TEMPORARY TABLE temp SELECT 種別,MAX(入荷日付) AS 入荷日付 FROM hoge GROUP BY 種別; CREATE TEMPORARY TABLE temp2 SELECT MAX(NO) AS NO FROM hoge INNER JOIN temp ON hoge.種別=temp.種別 and hoge.入荷日付=temp.入荷日付 GROUP BY hoge.種別; SELECT `hoge`.* FROM hoge INNER JOIN temp2 ON hoge.NO=temp2.NO

keims
質問者

お礼

御礼が大変遅くなってしまい申し訳ありません! 上記の方法でもやってみたところ問題なく結果を出す事が出来ました。 このSQLを実装用にアレンジし、PHPでのデータ加工を加えて無事望むソースが完成しました。 私はよくSQLの記述でつまづくので今後はより学習に努めたいと思います。yambejp様の的確なアドバイスで効率的なソースを作る事ができたこと、本当に感謝申し上げます。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

まず種別でgroup by して入荷日付のmaxをとり、その値でinner joinする。 その結果を種別でgroup by してNOのmaxをとり、その値でinner joinする。 テーブル名をhogeとしてこんな感じで SELECT `hoge`.* FROM hoge INNER JOIN (SELECT MAX(NO) AS NO FROM hoge INNER JOIN ( SELECT 種別,MAX(入荷日付) AS 入荷日付 FROM hoge GROUP BY 種別) AS temp ON hoge.種別=temp.種別 and hoge.入荷日付=temp.入荷日付 GROUP BY hoge.種別) AS temp2 ON hoge.NO=temp2.NO

keims
質問者

お礼

お答えありがとうございます! こちらのテスト環境で試したところ、ばっちり望み通りの結果がでました。 (このような形のサブクエリはやった事がなかったので大変参考になります。) ただ、問題が発生しました。 これを本番環境に移して実行したところ、 テスト環境と本番環境ではMYSQLのバージョンが違うらしく、 構文エラーが出てしまいました。 面喰って調べたところ、本番環境では、4.0.24を使っており、上記の記述では無理らしいのです。 私の調査不足で大変申し訳ありません。 MYSQL4.0系でも対応できる(create temporary table等の)別の記述方法で、同じ結果が出ないものでしょうか? もしおわかりになりましたら助かります。 どうぞよろしくお願い致します。

関連するQ&A

  • エクセルで複数の条件からデータを抽出する方法

    次のような表において、A列の入荷日、B列の製品名から、別表に月別に製品別毎の入荷数及び合計金額を求める関数を教えて下さい。   A         B    C(個数) D(単価)         2013/2/15   みかん    100     50 2013/2/30   みかん    200     50 2013/3/2    りんご     50     70 2013/3/4    ぶどう    150     40 2013/4/3    いちご    100     50    よろしくお願いします     

  • エクセル関数 データの抽出について

    エクセル2010 重複データの抽出。 重複データの抽出方法をご教示ください。 抽出先はシート1のA列A3~抽出データの分だけ リストはシート2のB2:AB32まで フィルターオプションなども使ってみたのですが どうも上手くいきません。 どなたか知恵をお貸しください。 方法はできれば関数だといいのですが(データが増えてもいいように) できなければ他の方法でもいいです。 VBAなどは全くの初心者なので出来れば避けたいのですが… シート2     A    B   C    D~AB32 1  "" 2 いちご ばなな いちご りんご 3 みかん いちご ばなな いちご 4 りんご ばなな いちご みかん 5 みかん いちご ばなな りんご 6 ばなな ばなな りんご いちご : : 32 シート1(重複データなし)  A 1  "" 2  "" 3 いちご 4 みかん 5 りんご 6 ばなな 7 : : 抽出リストのデータはシート2のB2:AB32にぎっしり入っています。 宜しくお願い致します。

  • 複数条件で重複しないデータをカウントする方法

    困っています。 エクセルの関数を教えてください。 複数条件に該当するデータをカウントする方法を教えてください。 A列とB列には不特定多数の名称と地名が入力されています。 このような表です。 A列(品名)    B列(出荷先)     いちご       東京 いちご       埼玉 いちご       東京  みかん       山梨 みかん       岐阜 りんご       埼玉  りんご       大阪 りんご       大阪 以下1500品目 A列のいちごでB列の出荷先が東京であるものは2件あります。 この「件数」を関数で表示させる方法を教えてください。 よろしくお願いいたします。

  • Excel2003 複数の条件を満たすデータを抽出する関数を教えて下さ

    Excel2003 複数の条件を満たすデータを抽出する関数を教えて下さい! 下のデータで、A列でB、B列で赤を選んだ人は「みかん」という「みかん」を抽出する関数を教えて頂けませんでしょうか? データシートとは別に集計シートを作成しています。 お忙しい中恐れ入りますが、ご教示下さいますようお願い申し上げます。。。 ●データ A B C 1 A 赤 みかん 2 B 赤 りんご 3 C 白 いちご 4 B 青 いちご 5 D 赤 みかん 6 A 青 みかん 7 C 黄 りんご 8 E 赤 バナナ

  • 【Excel】文字データの検索&一致不一致の判断

    Excelで以下のような列があります。    A 1 りんご 2 みかん 3 ぶどう 4 いちご (以下略) ここで、A列に対してすでにA列に存在しているデータが入力された場合、B列に×を返し、存在していないデータなら○を返すような式を入れたいです。    A    B 1  りんご   ○ 2  みかん   ○ 3  ぶどう   ○ 4  いちご   ○ ・・・ 19 ばなな  ○ 20 りんご  × どのような関数を入れれば良いか、教えていただきたいです。 よろしくお願いします。

  • Excel データの個数を複数条件付きでカウントしたい

    OS:XP Ver.:Excel2003 Excelの関数で質問です。 いろいろ調べたのですがどうしてもわかりません。 お知恵をご拝借下さい。 A B C D 1月 2月 3月 りんご 250 0 300 みかん 150 80 0 りんご 88 150 200 いちご 0 300 85 ぶどう 0 350 89 (確認画面にするとずれてしまいますが、A列には品名、B~D列には月が入るようになっています。) 上記のような元データがあり、(実際はもっとたくさん) 1月    2月    3月 りんご みかん いちご ぶどう (こちらもずれてしまいますが、それぞれの月の品名ごとの集計を入れたいのです。) のような表を完成させたいと思います。 (1)表に入れるのは、合計数量ではなく【データの個数】です。 1月のりんごは2、みかんは1、という感じです。 ただし、0はカウントしたくないので、1月のいちごとぶどうは0を 返してほしいのです。 countifやsumproductなど考え付くあたり試してみましたが、うまくできません。 どういう数式(関数)を入れればよいのでしょうか? (2)2月以降のデータ範囲を指定する場合はどうすればいいのでしょうか?  1月ならA2:B6とするのかもしれませんが、2月の場合は1月列(B列)が不要ですよね?

  • Excelの関数を使用したデータ抽出

    Excelの関数を使用したデータ抽出 Excelの関数を使用して以下のようなデータ抽出をすることは可能でしょうか? Aに以下の基本データがあります。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA りんご 100 1/1 1/1 80 001 AAA りんご 120 1/3 1/3 80 002 BBB みかん 200 1/1 1/1 90 003 BBB みかん 210 1/5 1/5 90 004 BBB みかん 220 1/5 1/5 90 005 --------------- Bに型番のみのデータがあります。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA BBB BBB CCC AAA AAA AAA CCC BBB BBB BBB --------------- Aから抽出したデータをBに反映させたいです。 以下のような形です。 --------------- 型番 商品 価格 受注 出荷 仕入 No AAA りんご 100 1/1 1/1 80 001 BBB みかん 200 1/1 1/1 90 003 BBB みかん 210 1/5 1/5 90 004 CCC ぶどう AAA りんご 120 1/3 1/3 80 002 AAA りんご AAA りんご CCC ぶどう BBB みかん 220 1/5 1/5 90 005 BBB みかん BBB みかん --------------- 宜しくお願い致します。

  • Excelで複数条件で抽出した複数データを出力

    Excelで複数条件で抽出した複数データを出力したい Shett1のセルAとセルBの複数条件で、Sheet2を検索し一致したSheet2のセルCを Sheet1の該当するセルCに入れたいのです。 それを関数でするのはどうしたらいいのでしょうか? Sheet1 A B NAME ID(タイトル) いちご A01 いちじく A02 かき B01 すいか C01 なし D01 ぱいなっぷる E01 ばなな E02 ぶどう F01 みかん G01 めろん H01 もも I01 りんご J01 Sheet2 A B C 名前 ID 漢字(タイトル) みかん G01 蜜柑 いちご A01 苺 ぶどう F01 葡萄 りんご J01 林檎 もも I01 桃 かき B01 柿 なし D01 梨 すいか C01 西瓜 いちじく A02 無花果

  • Excelの使い方で質問

    例えば、 A列1~10には「No.」として1~10の数字が順番に入ってます。 B列1~10には「りんご」「みかん」「いちご」「ぶどう」という文字がいくつかずつ入っています。 そういうデータで「りんご」は「No.」いくつといくつにあるか、「みかん」は「No.」いくつといくつにあるか、「いちご」は…、「ぶどう」は…、といったように集計したいと思っています。 りんご 1,5,6 みかん 9 いちご 2,3,9 ぶどう 4,7,8,10 といった感じにできれば良いのですが、どうすればよろしいのでしょうか? よろしくご教授ください。

  • Excel 2つの重複データに重複先セル番地を表示させたい!

    お世話になります。 エクセルで2つの重複しているデータがランダムにがあります。 下記のように表示いたいのですが、良いほうを教えて下さい。 たとえばA1のみかんがA7と重複している時【7】と表示したい ※VBAはわかりません。関数は得意です。  よろしくお願いします。 A  B C 1  7 みかん 2  5 りんご 3    もも 4  6 なし 5  2  りんご 6  4  なし 7  1  みかん 8  9  ぶどう 9  8  ぶどう