• ベストアンサー

SQLについて教えてください テーブルAの項目はF

QLについて教えてください テーブルAの項目はF1,F2,F3で内容が F1,F2,F3 1, 0, 0 1, 1, 0 1, 1, 1 1, 1, 2 2, 1, 1 2, 1, 2 3, 1, 0 3, 2, 2 3, 2, 3 F1をグループ化しF2の最大値の中でさらにF3が最大の行を取得したいのですが どのようなSQLにすればよいてすか?

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

こんな感じでもいいかもしれません。 select * from テーブルA T1 where not exists ( select * from テーブルB T2 where T2.F1 = T1.F1 and (T2.F2 > T1.F2 or (T2.F2 = T1.F2 and T2.F3 > T1.F3)) );

sql1204
質問者

お礼

ありがとうございます 集計関数を使わなくてもいけるんですね、勉強になりました。

その他の回答 (4)

回答No.5

相関サブクエリは遅くなりがちです。 F1グループ化、F2最大の集計クエリを作成する。 これと元のテーブルと内部結合した集計クエリで、F1, F2 グループ化、F3最大 というようにクエリを2段にすればいいでしょう。 サブクエリを使えば、一つのクエリにできます。 SELECT F1, F2, MAX(テーブルA.F3) AS F3 FROM テーブルA INNER JOIN (SELECT F1, MAX(F2) AS MaxF2 FROM テーブルA GROUP BY F1) Q ON テーブルA.F1=Q.F1 And テーブルA.F2=Q.MaxF2 GROUP BY F1,F2;

sql1204
質問者

お礼

ありがとうございます 参考にしてみます

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

SQLの種類やバージョンによってSQL文は異なりますが 社員ごとの最終日の最終伝票番号をとりたいということであればこんな感じ。 レコードが多数あるようであれば適切なインデックスが必要です select F1,F2,MAX(F3) AS F3 from hoge WHERE (F1,F2) IN (select F1,MAX(F2) from hoge GROUP BY F1) GROUP BY F1,F2

sql1204
質問者

お礼

ありがとうございます データベースはMSAccessです ※MSAでは対応してないようです。「EXISTSを使用していない・・・」

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

>F1をグループ化しF2の最大値の中でさらにF3が最大の行を取得 今回の命題だと、F2が最大値のF1にあたるレコードのF3の最大値を取得する場合 (1)F1値が複数あった場合、F3を複数得るのか (2)F1値が複数あった場合でもF3同士の最大値を持つレコードを得るのか わかりません。 今回の例示であれば「3,2,3」が得られますが かりに、「1,2,4」があった場合、解は (1)であれば「1,2,4」と「3,2,3」の両方を取る (2)であれば「1,2,4」のみとなります またそれとは別に仮に「4,2,3」があった場合 (1)であれば「3,2,3」と「4,2,3」の両方を取りますが (2)であればどちらを取っていいのかわかりません。

sql1204
質問者

補足

早速のご回答ありがとうございます 説明不足ですみません 具体的に言うとF1が社員番号、F2が売上日、F3が伝票番号(入力順番)だとして 社員がA・B・Cいたとして社員毎に最大売上日の最大伝票番号が知りたい場合 どのようなSQLになるかが知りたいのですが?

回答No.1

select F1,F2,max(F3) from tbl t1 where F2=(select max(F2) from tbl t2 where t2.F1=T1.F1) group by F1,F2 order by 1; です。

sql1204
質問者

お礼

早速のご回答ありがとうございます 試してみます

sql1204
質問者

補足

教えて頂いたSQLで確認出来ました。 ありがとうございます。 ※かなり問合せに時間はかかるようですね

関連するQ&A

  • オラクルのSQLで複数テーブルの一括件数取得

    テーブルAとテーブルBがあって、それぞれに 項目Aがあり、 その項目Aが 0の件数を取得したのいですが、高速化のため 1度のSQLで 取得したいのです。 どのようにすればいいでしょうか? 例 テーブルAの項目A 0 1 2 0 テーブルBの項目A 1 0 0 2 0 この場合、テーブルAが 2件で テーブルBが 3件となります。 それぞれ別々に取得するやり方は わかります。 それぞれ別々に取得する(2回する)のを1回で取得するようにすれば 少しは 速くなるのでは ないのかと思いすが、 いかに取得したら 速くなるのか 教えてください。

  • 2つの情報を1つのSQLで取得する方法について

    お世話になります。 SQL文で、下記内容のデータを取得する方法がわかりません。 ・TESTテーブルからA、B、Cの3項目のデータを取得する。 ・但し、この中のC項目については、WHERE句の条件を満たす データの最大値を取得する。 ・項目AおよびBの取得条件は、項目Cと同一条件とする。 ・目的は、項目AおよびBに関しては、WHERE句の条件を満たす  全てのレコードを取得し、項目Cにおいては最大値のみ取得したい。 上記内容を取得しようと考えた場合、 現時点で下記のSQL文を作成して実行しましたが、 うまくデータが取得できません。 SELECT A, B, C FROM TEST WHERE C = (SELECT MAX(C) FROM TEST) AND Z = 'xxxxx' AND Y = 'x' AND X = 'Y' ※項目X, Y, ZはTESTテーブルのカラムです ※上記SQLを、A、Bのみ取得用とCのみ取得用に   それぞれ分解して実行すると、それぞれの結果は   正常に取得できます。 2つの結果を1つのSQLで取得することは可能でしょうか? どなたかご教授願えますか?よろしくお願いいたします。

  • テーブルのマージSQLに関して

    初歩的なSQLの質問で申し訳ありません。 以前にも同じような内容で投稿させて頂きましたが、教えて下さい。 下記のような、ある異なる名前の同項目を持つ2つのテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容、所属、時間、結果 Bテーブル  社員番号、日付、内容、理由  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 以前に以下のようなUNIONを教えてもらいましたが、所属、時間、結果、理由という 項目全てを出力するとした場合、どのように記載すれば良いでしょうか? UNIONの場合、項目が異なるとエラーとなってしまうかと、、、 《UNIONのSQL》 SELECT * FROM ( SELECT 社員番号, 日付, 内容 FROM Aテーブル UNION SELECT 社員番号, 日付, 内容 FROM Bテーブル ) ORDER BY 日付, 社員番号, 内容 教えて下さい。 よろしくお願いします。

  • SQLについて教えてください

    お世話になっております。 以下、取得したい内容です。 この内容に対して、どのようにSQLを書けばよいか良いか教えて頂きたいです。 (1)DBの全テーブルに対して特定のカラムを取得したい。(カラム名はA,Bとする) (2)取得したカラム.Aに格納されている各値に対して、カラム.Bの各レコードの項目には何の値が格納されているか知りたい。 DBはオラクルですが、オラクルでしか使えないSQL構文はつかないようにしたいです。 自分で考えたSQLは、 SELECT A,B FROM * GROUP BY A,B ですが、そもそも全テーブルを指定する際に使用するのが、「*」では正しくないような気もします。 説明がつたなくて申し訳ございません。 宜しくお願い致します。 ・テーブルイメージ テーブル.test1 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 3 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test2 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 1 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test3 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 3 | | 02 |AA| 1 | | 03 |AC| 2 | | 04 |AC| 3 | +--------+------+

  • SQLについて教えてください

    お世話になります。 SQLについて教えてください AテーブルとBテーブルからCテーブルを作成したいのですが、 KEYをキーにAテーブルのIDが1で、YYMMが一番新しい項目(最大の項目)を 取得し、Cテーブル作成したいのですが、どのようにするのでしょうか? Aテーブル    Bテーブル   Cテーブル KEY ID yymm   KEY     KEY YYMM AAA 0 200612  AAA     AAA 200611 AAA 1 200611  BBB     BBB 200611 AAA 1 200609 BBB 0 200611 CCC 1 200611

  • SQLについて

    以下のSQLを作成したいのすが 実現方法が判りません お助けください。 環境:SQL SERVER2008 実現したいこと 明細テーブルの挨拶項目にマスターA・Bからメッセージを取得したい。 基本はAマスターのメッセージを取得 コードを1つのグループとして扱いマスタBに合致する場合 マスタAでは無くてマスタBのメッセージを取得したいです。 よろしくお願いいたします。 具体的に取得したい結果は ☆望む結果になります。 コードは必要ないのですが、 判別の為一緒に表示いたしました。 マスタA 挨拶 メッセージ 000601 おはよう 000602 こんにちは 000603 こんばんは 000604 お休みなさい 000605 就寝中 マスタB(最大3つまでの組合せです) 挨拶1 挨拶2 挨拶3 メッセージ 000601 000602 000603 おはようございます。 000602 000603 こんにちは・こんばんは 明細テーブル コード 挨拶 000153 000601 000153 000602 000153 000603 000154 000602 000154 000603 000155 000604 000156 000605 ☆望む結果 コード メッセージ 000153 おはようございます。 000154 こんにちは・こんばんは 000155 お休みなさい 000156 就寝中

  • SQL(初心者です) 3つのテーブルを結合

    下のような3つのテーブルを結合したいのですが SQL1つで可能でしょうか? 条件は 1.品種機械テーブルを読み込みます。 品種でユニークしますが使用日付を降順にならべ変えます。品種機械テーブルから使用日付がMAXのものの行データをすべて取得(下の場合:A 4 20051204・・)ほかはいりません。 2.品種テーブル読み込む。 1で取得した品種と一致する行データをすべて取得 3.機械テーブルを読み込む 2で取得した機械と一致する行データをすべて取得 うまい方法がおもいつかないのでアドバイスや 参考になりそうなホームページなどありましたら教えていただけないでしょうか? 宜しくお願いします。 --------------------------------------------- (1)品種テーブル(品種を管理) 品種  ・・・etc A   B C D --------------------------------------------- (2)機械テーブル(機械を管理) マシン ・・・etc 1 2 3 4 ------------------------------------------ (3)品種機械テーブル(品種と機械を管理) 品種 | マシン | 使用日付 |・・・etc A | 1 | 20051201 A | 2 | 20051202 A | 3 | 20051203 A | 4 | 20051204

  • oracle11gで、PL/SQLにてAというテーブル内の項目にCLO

    oracle11gで、PL/SQLにてAというテーブル内の項目にCLOB型のデータがあります。 そのCLOB型項目を別テーブルの1、2、3のVERCHAR2型にそれぞれ4000バイトずつに 振り分けたいと考えています。 CLOB型ですと、DBMS_LOB.SUBSTRを使用する方法等があると思いますが、バイト数で振り分ける方法なないものでしょうか? 教えて頂きますようお願いします。

  • テーブルから項目が読めません

    既存のテーブルに項目を追加したのですが、 そのテーブルを「SELECT *」でよんでも 追加した項目がよめません。 ためしに、Accessにインポートし、同じSQL文を使うとちゃんと追加した項目もとってくるのですが...。 どうしてでしょうか? どなたか、教えてください!!!

  • SQLの書き方

    以下の条件を取得したいのですがどのようなSQLを組めばいいか悩んでます。 テーブルA(列はC1,C2,C3,C4 PKはC1,C2です。) ■テーブルAのデータ C1  C2   C3   C4 1   1   50   備考1です。 1   2   75   備考2です。 2   1   25   備考3です。 3   1   75   備考4です。 3   2   90   備考5です。 3   3   50   備考6です。 ■取得したい結果 C1  C2   C3   C4 1   2   75   備考2です。 2   1   25   備考3です。 3   2   90   備考5です。 ■取得したい条件 C1でグルーピングしたなかでC3の値が一番大きな行を取得する。 現在は以下のようなSQLを書いています。 SELCT T1.* FROM テーブルA T1, (SELECT C1,MAX(C3) AS C3MAX FROM テーブルA GROUP BY C1) T2 WHERE T1.C1 = T2.C1 AND T1.C3 = T2.C3MAX もう少し簡単なSQLで出来そうですが、うまく思いつきません。 宜しくお願いします。