複数テーブルのMAX値の行データを取得する方法
- 複数のテーブル(A、B、C)から特定の条件下でMAX値の行データを取得する方法について解説します。
- SAGYO_NOを指定したA、B、Cのうちで、SAGYO_DTが最新の行のSAGYO_DT、TANTO、NAIYOを一回のSQLで取得する方法を紹介します。
- 質問文章ではうまくできないと述べられていますが、本記事で解説する方法を使うことで問題を解決することができます。
- ベストアンサー
複数テーブルのMAX値の行データを取得したい
テーブルA、B、Cとも共通して以下のカラムを持っています。 SAGYO_NO (VARCHAR) SAGYO_DT(DATE型) TANTO (VARCHAR) NAIYO(VARCHAR) SAGYO_NOを指定したA、B、Cのうちで(WHERE SAGYO_NO = '01')、 SAGYO_DTが最新のものの、 SAGYO_DT、TANTO、NAIYOを一回のSQLで取得したいのですが、 うまくできなくて困っています。 いい案がありましたらお願いします。 (例) テーブルA 01 2011/03/01 AAA BBB 01 2011/03/08 CCC DDD テーブルB 01 2011/03/05 EEE FFF テーブルC 01 2011/03/02 GGG HHH ⇒上記の場合、テーブルAの'2011/03/08','CCC','DDD'を取得したいです。 よろしくお願いいたします。
- kokondou
- お礼率75% (6/8)
- Oracle
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SELECT SAGYO_NO,SAGYO_DT,TANTO,NAIYO FROM ( SELECT U.*, RANK() OVER( ORDER BY SAGYO_DT DESC) RNK FROM ( SELECT * FROM (SELECT * FROM テーブルA WHERE SAGYO_NO = '01' UNION ALL SELECT * FROM テーブルB WHERE SAGYO_NO = '01') UNION ALL SELECT * FROM テーブルC WHERE SAGYO_NO = '01' ) U ) WHERE RNK=1;
その他の回答 (2)
- a_ka_
- ベストアンサー率16% (1/6)
No.1の方の回答に少し条件追加m(_ _)m select * from ( select rownum,A.* from ( --テーブルAのMAXの日付のレコード抽出 select SAGYO_DT,TANTO,NAIYO from テーブルA where SAGYO_DT in(select max(SAGYO_DT) from テーブルA) and SAGYO_NO = '01' union all --テーブルBのMAXの日付のレコード抽出 select SAGYO_DT,TANTO,NAIYO from テーブルB where SAGYO_DT in(select max(SAGYO_DT) from テーブルB) and SAGYO_NO = '01' union all --テーブルCのMAXの日付のレコード抽出 select SAGYO_DT,TANTO,NAIYO from テーブルC where SAGYO_DT in(select max(SAGYO_DT) from テーブルC) and SAGYO_NO = '01' ) A --降順で並び替え order by SAGYO_DT desc) where rownum = 1;
お礼
ありがとうございます。 参考になりました。
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 レスポンス的には微妙ですが・・・。 UNION して、 ORDER BY して、 ROWNUM = 1 ですかね・・・。
お礼
ありがとうございます。 参考になりました。
関連するQ&A
- SQLを教えてください。
テーブルAとテーブルBは1:Nの関係です。 取得したい値が上手く取れないため、テーブルAにテーブルBのJOINを2回実行して取得している為、パフォーマンスが悪いです。 1回で取得する方法、もしくはパフォーマンスが良い方法があれば教えてください。 ■テーブルA(PKはa1) a1 001 002 003 ■テーブルB(PKはb1,b2,b3) b1 b2 b3 b4 001 1 3 aaa 001 1 2 bbb 001 1 1 ccc 001 2 3 ddd 001 2 1 eee 002 1 1 fff 002 2 3 ggg 002 2 2 hhh ■取得したい結果 a1 b4-1 b4-2 001 aaa ddd 002 fff ggg
- 締切済み
- Oracle
- VBAでCSV内にある改行を取る方法
あるシステムが吐くcsvファイルの項目の中に改行が入っているものがあります。 例) 01,aaa,bbb(改行)bbb,ccc(改行) 02,ddd,eee,fff(改行) 03,ggg(改行)ggg,hhh,iii(改行) このCSVファイルをエクセルのマクロで読み込んでシートに展開したい のですが、項目中にある改行で別レコードを認識してしまいます。 結果) A B C D ---+---+---+--- 01 aaa bbb bbb ccc 02 ddd eee fff 03 ggg ggg hhh iii これを以下のようにしたいのですが・・・ A B C D ---+------+------+---- 01 aaa bbbbbb ccc 02 ddd eee fff 03 gggggg hhh iii どうやればよいでしょうか? ご教授お願いいたします。
- ベストアンサー
- オフィス系ソフト
- SQL 複数条件を設定
使用言語はjavaで処理しており、 SQL Server2005にて下記のようなテーブル(T_Kekka)があります。 ID a-1 a-2 b-1 b-2 c-1 c-2  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 2 ggg bbb ccc hhh iii jjj 3 bbb mmm ddd ccc fff eee 4 bbb aaa ccc ddd qqq rrr 5 zzz sss ttt ccc vvv xxx 6 zzz aaa ttt ccc vvv fff 7 zzz zzz zzz zzz zzz zzz 8 qqq rrr ccc ddd fff eee 検索する値は下記の通りです。 検索値 |a-1|a-2|b-1|b-2|c-1|c-2|  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |aaa|bbb|ccc|ddd|eee|fff| 期待値としては、aはaのグループで検索、bはbのグループで検索、cはcのグループで検索をし、 一致個数の多い順に出力したいと考えております。(理想は下記のような感じです。) また、グループ内であれば逆転していてもOKです。 (例えばID:1のaグループのような感じです。) *1 一致数が同じ場合はcグループの数が多いデータが最優先となり、その他はID順になります。 期待値 ID a-1 a-2 b-1 b-2 c-1 c-2 一致数  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1 bbb aaa ddd ccc eee fff 6 3 bbb mmm ddd ccc fff eee 5 8 qqq rrr ccc ddd fff eee 4・・・*1 4 bbb aaa ccc ddd qqq rrr 4 6 zzz aaa ttt ccc vvv fff 3 2 ggg bbb ccc hhh iii jjj 2 5 zzz sss ttt ccc vvv xxx 1 7 zzz zzz zzz zzz zzz zzz 0 知識不足のため私には複雑すぎて悩んでいる状況なので、 どなた様か知識がある方にご教授願いたく思います。 また、まだテスト段階なので現状のようなテーブル構造にしてしまいましたが、 他のテーブル構造の方がデータが抽出しやすかったり、レスポンスがいい場合がありましたら、 ご教授いただけると助かります。 説明が分かりづらく表が見づらくて申し訳ございませんが、 宜しくお願い致します。
- ベストアンサー
- SQL Server
- 大量データの一括変換
aaa.bbb ccc.ddd eee.fff ggg.hhh 上記のようなデータが約1万行程度あるのですが、これを下記のようなユーザ名・メルアドに変換するコマンド等、お分かりになる方教えてください。ユーザ名・メルアドの間は半角スペースです。 ある程度自分で調べた結果awk等で出来そうな気がするのですが。。。 ユーザ名 メルアド ↓ ↓ aaa.bbb aaa.bbb@hoge.com ccc.ddd ccc.ddd@hoge.com eee.fff eee.fff@hoge.com ggg.hhh ggg.hhh@hoge.com
- 締切済み
- その他(プログラミング・開発)
- 集計方法について教えて下さい。PHP+MYSQL
こんにちは、よろしくお願い致します。 データベースに下記のようなデータが入っています。 table_A cd name --------------- 1000001 aaa 1000002 bbb 1000003 ccc 1000004 ddd 1000005 eee 1000006 fff 1000007 ggg 1000008 hhh 1000009 iii 1000010 jjj table_B cd type point --------------- 1000001 A 100 1000001 B 50 1000001 C 30 1000004 C 20 1000005 B 70 1000009 A 10 1000009 C 40 table_Aと、table_Bから、下記table_Cの内容 table_C cd name count point_total ------------------------------ 1000001 aaa 3 180 1000002 bbb 0 0 1000003 ccc 0 0 1000004 ddd 1 20 1000005 eee 1 70 1000006 fff 0 0 1000007 ggg 0 0 1000008 hhh 0 0 1000009 iii 2 50 1000010 jjj 0 0 を得るには、どのようなSQLを書けば良いのでしょうか? table_Cのcount項目は、cdでマッチするtable_Bのtypeの種類をカウントしたもので table_Cのpoint_total項目は、cdでマッチするtable_Bのpointを合計した数値になります。 分かりにくい質問ですみませんがアドバイス頂けると嬉しいです。 具体的にどのような方法で実現できるか、教えて頂けると有難いです。 よろしくお願いいたします。
- ベストアンサー
- PHP
- EXCEL VBA 行列操作
どなたか教えてください。 下記の様にA1からH5までの範囲に値がある行とない行があります。 空白セルを無視しA10に行列を操作し(行列入れ替え?)、さらに上詰め でコピーしたいのです(上にある行から列順に)。 よろしくお願いします。 例です A B C D E F G H 1 2 aaa bbb 3 ccc ddd eee fff ggg 4 5 hhh ~ 10 aaa 11 bbb 12 ccc 13 ddd 14 eee 15 fff 16 ggg 17 hhh
- ベストアンサー
- Visual Basic
- C言語による「テキストファイルの読み書き(fprintf)」について
C言語による「テキストファイルの読み書き(fprintf)」について質問です ずぶの初心者ですが、既知のファイルの1行目に指定した文字列を付加させるプログラムを作りたいと思っています。 以下のように作りました。 ------------------------------------------------------------ #include <stdio.h> int main(void) { FILE *fp; fp = fopen("test.csv","r+"); fprintf(fp,"コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56\n"); fclose(fp); return 0; } ------------------------------------------------------------ このとき「test.csv」の内容が以下のようであったとします。(容量は1MBくらいです。) 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj この状態でプログラムをコンパイルして実行すると、「test.csv」の内容が以下のようになってしまいます。(一行目が消える) AAA,BBB,CCC,DDD,EEE 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj またcsvの行が増える度に妙な挙動になっていきます・・・(一行あいたり、先頭行が5行ほど消えたり) 希望する動作としては コントロールカラム1,コントロールカラム2,・・・(略)・・・,コントロールカラム56 001,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj 002,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj ~(略) 5000,aaa,bbb,ccc,ddd,eee,fff,ggg,hhh,iii,jjj のようになるようにしたいのですがどのようにすればよいのでしょうか。 よろしくお願いします。 (使用ソフト:Borland C++ Compiler, Cpad) 参考にしたサイトの項目:http://homepage3.nifty.com/mmgames/c_guide/17-01.html
- ベストアンサー
- C・C++・C#
- EXCELで複数行の検索
初心者です。 Aファイルのaaa、bbbなどをキーに Bファイルを検索してできるだけ簡単にマクロ等使わずに 下記のような抽出をする方法があれば教えてください。 よろしくお願いします。 Aファイル aaa bbb ccc Bファイル(例えば「ddd」と「あ」は別セルです) ddd あ eee い aaa う fff え bbb お ggg か ccc き 結果 Aファイル aaa う bbb お ccc き
- ベストアンサー
- オフィス系ソフト
- 2つのテーブルで一致しているものを抽出する。SQL文で作成。
OS:WindowsXP SQLServer2000 <質問> SQL文が浮かばなくて困っています。 どなかたお力を貸していただけないでしょうか。 以下、やりたいことです。 【条件】 1 AテーブルとBテーブルで郵便番号が一致しているものを抽出 2 AテーブルとBテーブルに「番号」列を追加し、初期値を「0」とする 3 1の抽出後、同じ郵便番号がBテーブルに複数あった場合、 2で追加した「番号」列を0→”抽出した行分の数字”にする。 一応、【条件】1の箇所(下記)は浮かんだのですが、 2と3が分かりません。 select Aテーブル.*,Bテーブル.* from Aテーブル,Bテーブル left outer join Aテーブル on Aテーブル.郵便番号 = Bテーブル.郵便番号 WHERE ??? ●Aテーブル ID | 名前 | 郵便番号 | 番号 ----------------------------------------------------------------- 01 | 小林 | 101-1000 | 0 02 | 鈴木 | 102-1000 | 0 03 | 田中 | 103-1000 | 0 04 | 町田 | 104-1000 | 0 05 | 木村 | 105-1000 | 0 06 | 中田 | 106-1000 | 0 ●Bテーブル ID | 分類 | 郵便番号 | 番号 --------------------------------------------------------------------- 01 | AAA | 101-5555 | 0 03 | CCC | 103-1000 | 0 04 | DDD | 104-1000 | 0 05 | EEE | 105-1000 | 0 06 | FFF | 105-1000 | 0 07 | GGG | 106-1000 | 0 08 | HHH | 106-1000 | 0 09 | KKK | 106-1000 | 0 ↓出したい結果↓ ID | 名前 | 郵便番号 | 分類 | 番号 ------------------------------------------------------------------------------- 03 | 田中 | 103-1000 | CCC | 0 04 | 町田 | 104-1000 | DDD | 0 05 | 木村 | 105-1000 | EEE | 2 05 | 木村 | 105-1000 | FFF | 2 06 | 中田 | 106-1000 | GGG | 3 06 | 中田 | 106-1000 | HHH | 3 06 | 中田 | 106-1000 | KKK | 3 以上になります。 どうぞよろしくお願い致します。
- ベストアンサー
- SQL Server
- Excel2000 データの振り分けと配列変換について
シート1にデータを一気に入力してあります。 第1段階、所属ごとに所属1は所属1のシート、所属2は所属2のシートというようにシートに振り分けをしたい。 第2段階、振り分け後データごとに2列になるように印刷をしたい。 この様に入力されているデータを A B C D 番号 名前 所属 1 AAA 1 2 BBB 2 3 CCC 1 4 DDD 3 5 EEE 4 6 FFF 5 7 GGG 6 8 HHH 3 9 III 4 10 JJJ 6 ・ ・ ・ 所属ごとにシートに振り分けて、2列 任意の単位で(この場合では、5単位ごと)になるように印刷したい。 所属1のシート 番号 名前 所属 番号 名前 所属 1 AAA 1 6 FFF 1 2 BBB 1 7 GGG 1 3 CCC 1 8 HHH 1 4 DDD 1 9 III 1 5 EEE 1 10 JJJ 1 技が無いため、切り張りしていますが、なにか良い方法がありましたら教えてください。
- 締切済み
- オフィス系ソフト
お礼
ありがとうございます。 参考になりました。