• ベストアンサー

スペシャリストの方! 助けてください! GROUP BY を使わずに最小値も求めたい。

table A A_No, 社員番号, 住所 1 ,0001,'東京都' 2 ,0002,'神奈川県' 3 ,0003,'千葉県' table B B_No,社員番号,履歴番号,日付 1,0001,1,2008/09/11 2,0001,2,2008/09/11 3,0002,1,2008/09/05 4,0002,2,2008/09/11 上記のようなtable A, tableBがあるとします。 社員ごとに今日日付で最小の履歴番号を持つB_Noを取得したいのです。 上記で言えば、今日が2008/09/11 だとして社員0001は 最小履歴番号 1 、社員0002は最小履歴番号 2 の B_Noを取得したいのです。 ただし、フレームワークの仕様によりgroup byが使えません・・・。 なにかいい案はありますか? どなたか助けてください! よろしくお願いします。

  • Oracle
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
回答No.3

何が使えて何が使えないか判らないのですが・・ 結合を使うなら・・ select a.社員番号, (select min(履歴番号) from tableB b where a.社員番号=b.社員番号 and b.日付>=trunc(sysdate,'dd')) 履歴番号 from tableA a ; 結合を使いたくない、TableBだけでやりたいなら・・ select 社員番号,履歴番号 from ( select b.*,row_number() over(partition by 社員番号 order by 履歴番号) R from tableB where 日付>=trunc(sysdate,'dd') ) where R=1 ;

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.2

GROUP BYが使えないというのは文字通りの意味と解していいのですか? (=GROUP BYの文字がなければよい。集計関数は使ってもよい) SELECT * FROM TableB s WHERE s.日付=(指定した日付) AND 履歴番号 IN (SELECT MIN(履歴番号) FROM TableB WHERE 社員番号=s.社員番号 AND 日付=s.日付) MINもだめなら、ROWNUMでやるしかないですが。。

  • bodyshot
  • ベストアンサー率14% (46/326)
回答No.1

社員の数だけSQL分を用意して個別に集計すればよいと思います。

関連するQ&A

  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • GROUP BYについて

    お世話になっております。GROUP BY に関してつまずいています。 色々と調べているのですが、解決できないため質問させて下さい。 まず下記のような履歴テーブルがあります。 rireki_member_noとは投稿者のIDであり、title1、title2に登録された日付データ(date型)は その投稿者が投稿した日付が登録されています。(title1だけの場合もあればtitle2だけの場合もあり、両方の場合もあります) rirekiテーブル rireki_no rireki_member_no  title1     title2  1       2       2014-09-12   2       1                 2014-09-12  3       3       2014-09-14   2014-09-14  4       2       2014-09-18  5       1                 2014-09-19 また、下記は投稿者のテーブルであり、rireki_member_noと、member_noは紐付いたものとなります。 memberテーブル memner_no  member_name  1       佐藤  2       吉田  3       佐々木 そこで今回行いたいのは、タイトルを指定し、且つ日付を範囲指定した時、その会員の名前、そして投稿した日付を一覧で表示したいと考えていますが、その際のSQL文が分からず困っている状況です。 イメージ的には、 title2を指定し、2014-9-13から20149-19と範囲指定した場合 3  佐々木  2014-09-14 2  吉田   2014-09-19 といった結果を求めたいと考えています。 お恥ずかしいとは思いますが、実は昨夜からずっと悩んでいたりして・・・ rirekiテーブル単体であれば、 http://norm-nois.com/blog/archives/1293 で似たような内容で紹介されているのですが、今回のようにJOINが絡むと難易度が高くなっている状況です。 お忙しいなか恐縮ですが、お知恵を頂戴出来れば幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • グループごとの一番小さい値を取り出したい

    データベースに列A、Bがあり、その中は A b 1 1 1 2 1 3 1 4 2 2 2 3 2 5 を入力されていて、以下のようにAのグループの中の値で最小値を取得したいのです。 A B 1 1 2 2 MIN関数を使用すると、テーブル全ての最小値を取得してしまうので、上手くいきません。何かいい方法があるでしょうか?

  • GROUP化した時の最適なSQL文の書き方

    いつも勉強させて頂いています。 GROUP化した時に応答時間がかかるので、 短縮したいのですが、方法をご教示願います。 SQLSERVER2005 EXPRESS VB2008 テーブルA(注文NO、手配日付、品名、手配数) テーブルB(入荷NO、注文NO、入荷数、単価) テーブルAの注文NOに対して複数の入荷があります。 テーブルAの注文NOに対して未入荷の場合も「0」で出力します。 出力(注文NO、品名、入荷累計、平均単価、合計金額) SQL文を書く時に、注文NOでGROUP化してから抽出(手配日付)すると レコード件数が多いため、応答時間がかかってしまいます。 どのような書き方がよろしいでしょうか? この書き方では、時間がかかります。 SELECT テーブルA.注文NO, テーブルA.手配日付, テーブルA.品名, テーブルB2.入荷数, テーブルB2.単価 FROM テーブルA LEFT OUTER JOIN (SELECT 注文No, SUM(入荷数) AS 入荷数, AVG(単価) AS 単価 FROM テーブルB GROUP BY 注文No) AS テーブルB2 ON テーブルA.注文NO = テーブルB2.注文No WHERE (テーブルA.手配日付 = '2008/01/01') すべてのレコードをグループ化してから処理しているため、遅いと思います。 よろしくお願いいたします。

  • Group By を使用して任意のカラムの最大値のデータを取得する。

    Group By を使用して任意のカラムの最大値のデータを取得する。 次のようなテーブルデータがあるとします。   ID    店舗CD    適用日付   A001   101      20100701   A002   101      20100801   A003   101      20100901   B001   102      20100701   B002   102      20100801   B003   102      20100901 抽出イメージですが、このテーブルデータの店舗コードをGroupByして、MAX(適用日付) としたときにIDが取得できなくなります。 なのでGroupByしたときの日付最大値のデータのIDを取得したいのですがいい方法が浮かびません。  同じテーブルデータでGroupBy(店舗コード)、MAX(適用日付)としたサブクエリを(店舗CD=店舗CD)、(適用日付=適用日付)とInnerJoinする方法も考えましたが、万が一、適用日付と店舗CDが同一のものがあった場合、店舗CDが重複してしまいます。  各店舗CDの最大適用日付のID取得したいのです。 なのでイメージはGroupby(店舗CD)とMAX(適用日付)とした時にMAX(適用日付)のIDを取得し、 なおかつ欲をいえば、MAX(適用日付)のIDが複数存在する場合は、1店舗CDにつき一つの適用日付を取得したいです。(この際、IDはなんでもいいです。) 簡単そうなことですごく悩んでいます。 どなたか助けてください。 よろしくお願いします。

  • 簡単なSQLに関して

    初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容 Bテーブル  社員番号、日付、内容  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。

  • SQLで部分的にGROUP BYしたいとき(その2

    こんばんわ。 先日こちら(http://okwave.jp/qa/q7666702.html) で質問させていただきましたが、まだ問題があったため、 再度質問させていただきます。 以下のような20カラムある「出納帳」テーブルがあって、 同一日付の金額を集約してしまいたいです。 出納帳 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・ 3 2012/8/21 -1000 B01 ・・・ 4 2012/8/21 -2000 B02 ・・・ 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・ 7 2012/8/24 -3000 B03 ・・・ 8 2012/8/24 -4000 B04 ・・・ 9 2012/8/27 5000 A05 ・・・ ↓「日付」で金額集約 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・  2012/8/21 -3000    ・・・(-1000と-2000を集約) 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・  2012/8/24 -7000    ・・・(-3000と-4000を集約) 9 2012/8/27 5000 A05 ・・・ と集約キー以外はNULLにしたいのですが、 またまた、 ( SELECT ID, 日付, 金額, 伝票, ・・・ FROM  出納帳 WHERE  金額>=0 UNION ALL SELECT NULL, 日付, SUM(金額), NULL, ・・・ FROM  出納帳 WHERE  金額<0 GROUP BY 日付 ) ORDER BY 日付 とUNIONをする方法しか思いつかなかったのですが、 UNIONせずに端的に表現できるSQLはありますでしょうか?

  • エクセル(空き番号の最小値の取得について)

    空き番号の最小値の取得について エクセルにて付与するナンバーの管理をしています。 シートでは重複しない数字がA列で縦に並んでいます。 数列は、ところどころ空き番号があります。 その空き番号の最小値が取得したいのです。 例「1・2・3・○・5・○・○・8・~」 例でいうと「4」が取得したいのです。 一度のみの処理ではなく、列に「4」を追加すると、次最小値である「6」を取得したいです。 上記を実現できる関数式を教えてください。 よろしくお願いします。

  • MySQLのgroup by同士の結合について

    下記のようなSQLについてご指南頂きたく思います。 下記のようなテーブルがあり、 商品毎の売上を販売店毎に 売れた順に格納しています。 <販売テーブル> No | 商品コード | 販売個数 | 販売店コード --------------------------------------------- 1  | 商品A   |   1  | 1 2  | 商品A   |   1  | 2 3  | 商品A   |   1  | 3 4  | 商品B   |   2  | 1 5  | 商品B   |   2  | 2 6  | 商品B   |   1  | 3 7  | 商品A   |   3  | 1 8  | 商品A   |   4  | 2 9  | 商品A   |   1  | 3   上記のテーブルを使って下記のようなデータを取ってきたく考えております。   |商品コード|販売個数              |販売店コード |商品コード毎販売個数合計   |       |※ある商品の店毎の販売総数|          |※ある商品の販売総数   --------------------------------------------------------------------------------   | 商品A  |   4               | 1        | 11   | 商品A  |   5               | 2        | 11   | 商品A  |   2               | 3        | 11   | 商品B  |   2               | 1        |  5   | 商品B  |   2               | 2        |  5   | 商品B  |   1               | 3        |  5   -----------------------------------------------------------------------------   やり方としては下記の(1)と(2)の結合ができれば良いと考えております。   一回のSQLで上記の結果を得られるようにしたいと考えております。   どなたかアドバイス頂ければと思います。   宜しくお願い致します。 (1)下記のようなSELECT文で商品コード毎の集計はできました。    SELECT 商品コード,SUM(販売個数) FROM 販売テーブル group by 販売テーブル.商品コード;   | 商品コード  |販売個数             |         |※ある商品の店毎の販売総数   ---------------------------------------   | 商品A     |  11             | 商品B     |   5          (2)また、下記のようなSELECT文で販売店、商品コード毎の集計もできました。    SELECT 商品コード, SUM(販売個数), 販売店コード FROM 販売テーブル                       GROUP BY CONCAT(商品コード,'and',販売店コード) ;   | 商品コード |販売個数              |販売店コード   |        |※ある商品の店毎の販売総数 |        ----------------------------------------------------   | 商品A   |   4                | 1       | 商品A   |   5                | 2       | 商品A   |   2                | 3       | 商品B   |   2                | 1       | 商品B   |   2                | 2       | 商品B   |   1                | 3       ----------------------------------------------------

    • ベストアンサー
    • MySQL
  • 日付の最大値レコードを取得する方法について

    お世話になります。 SQLで日付の最大値を取得する方法です。 テーブルのデータ内容は以下のようになっています。 | 社員番号 | 社員名 | 日付 | 順序 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 100 | AAA | 2011/05/01 | 1 | +---------+-------+-----------+-----+ | 100 | AAA | 2011/04/01 | 1 | +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 2 |   ← このレコードを取得したい +---------+-------+-----------+-----+ | 200 | BBB | 2011/04/01 | 1 | +---------+-------+-----------+-----+ 取得したいレコードは、 社員ごとの最大日付の最大順序をもつレコードです。 (上記の1行目と4行目のレコードを取得したい) この場合、 下記のようなSQLを考えます。 --------------------------------- SELECT 社員番号, 社員名, 日付 FROM テーブル名 WHERE 社員番号 = 'xxx' AND 日付 = (SELECT MAX(日付) FROM テーブル名 ) AND 順序 = (SELECT MAX(順序) FROM テーブル名 ) ---------------------------------- 但し、上記の場合、 社員ごとに最大値レコードが取得できません。 どなたかレコード取得方法について 教えていただけないでしょうか? よろしくお願いいたします。