グループ化したデータから最小ステータスの受付日を抽出する方法

このQ&Aのポイント
  • 上記の質問文章では、管理番号でグループ化されたデータから最小ステータスの受付日を抽出する方法を求めています。
  • 通常は、SELECT文のGROUP BY句を使用して管理番号でグループ化し、MIN関数を使って最小ステータスを取得します。
  • ただし、受付日がステータスごとに異なる場合には、一意な最小ステータスの受付日を抽出するためには別の方法が必要です。
回答を見る
  • ベストアンサー

group by がうまくいきません。

以下のようなデータがあります。 管理番号 ステータス 受付日 502035   50     2012/09/28 502035   30     2012/09/25 502035   40     2012/09/30 502036   10     2012/09/28 502036   20     2012/09/30 502037   10     2012/09/29 上記のテーブルを管理番号でグループ化し、 ステータスの一番小さい番号の受付日を抽出したいと 考えています。 管理番号 ステータス 受付日 502035   30     2012/09/25 502036   10     2012/09/28 502037   10     2012/09/29 ↑求めたいSQL内容 SELECT 管理番号, Min(ステータス), 受付日 FROM ステータステーブル GROUP BY 管理番号 で行うと、受付日が異なるステータスだと 複数抽出されてしまいます。 First(受付日) Last(受付日)にすると受付日が うまく抽出されません。 受付日をステータスが一番小さな管理番号 でグループ化し、表示することはできますでしょうか? よろしくおねがいいたします。

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

  • ベストアンサー
  • PXU10652
  • ベストアンサー率38% (777/1993)
回答No.2

「受付日をステータスが一番小さな管理番号 でグループ化し、表示することはできますでしょうか?」  管理番号でグループ化した時点で、最小のステータスは抽出できますが、受付日はどのデータが抽出されるかは不定です。  なので、一旦ステータスと受付日を連結して、一つの項目(抽出用)にしてしまい、その最小値を抜き出してはどうでしょう? SELECT 管理番号, Min(ステータス & 受付日) AS 抽出用 FROM ステータステーブル GROUP BY 管理番号  こうすれば、以下のデータが抽出できるので、これを一旦テーブルに出力し、あとは、「抽出用」の項目の先頭2桁と残りの受付日に分割すれば、良いのではないでしょうか? 管理番号 抽出用 502035 302012/09/25 502036 102012/09/28 502037 102012/09/29

seido4818
質問者

お礼

回答、ありがとうございます。日付型とテキストを&結合して、Minが取れるんですね!助かりました。この方法で、抽出用をLEFTとRIGHTで分割して、無事に取得することができました。 ありがとうございました。

その他の回答 (2)

  • PXU10652
  • ベストアンサー率38% (777/1993)
回答No.3

「受付日をステータスが一番小さな管理番号 でグループ化し、表示することはできますでしょうか?」  管理番号でグループ化した時点で、最小のステータスは抽出できますが、受付日はどのデータが抽出されるかは不定です。  なので、一旦ステータスと受付日を連結して、一つの項目(抽出用)にしてしまい、その最小値を抜き出してはどうでしょう? SELECT 管理番号, Min(ステータス & 受付日) AS 抽出用 FROM ステータステーブル GROUP BY 管理番号  こうすれば、以下のデータが抽出できるので、これを一旦テーブルに出力し、あとは、「抽出用」の項目の先頭2桁と残りの受付日に分割すれば、良いのではないでしょうか? 管理番号 抽出用 502035  302012/09/25 502036  102012/09/28 502037  102012/09/29

回答No.1

具体的な失敗結果を提示して頂けますと、蓋し比較的に回答を申し上げやすくなるでしょう。

関連する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が一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • SQL GROUP BY

    SQLについてお聞きしたいです。番号カラムの中で最大の数字をもつフィールドと 同じコードを持つデータを、表から全て取得したいと思っているのですが 書き出すとGROUP BYの式が間違っているというエラーが出てしまいます。 SELECT * FROM 表 GROUP BY コード HAVING MAX(番号) = コード どう調べればいいのか分からず四苦八苦しています。どこを直せばよいでしょうか?

  • GROUP BY , MAX の使用法に関して

    いつもお世話になります。 GROUP BY , MAX の使用法に関して質問です。 USERCDとKYOUTUNOでグルーピングをしてSEQの最大値のレコードを抽出しようとしています。 以下のようなSQL文の場合ですとBIKOUがないレコードを抽出する事が出来るかと思います。 【select USERCD , KYOUTUNO , MAX(SEQ) from テーブル1 group by USERCD , KYOUTUNO】 そこで、BIKOU も同時に抽出したいのですが、BIKOUを選択列に入れると「GROUP BYの式ではありません。」のエラーが出ます。 「そりゃそうだ」だと思うのですが、どうのようにすればSQL文を作れば結果のようなレコードを抽出出来るのでしょうか? よろしくお願いします。 ◆テーブル1のデータ USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 1 あああああ 100 100 2 いいいいい 100 100 3 あいうえお 222 200 1 AAAAA 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 1 ううううう 44444 100 2 えええ ◆結果 USERCD KYOUTUNO SEQ BIKOU ------------------------------------- 100 100 3 あいうえお 222 200 2 AAAAAA 3333 100 1 うううううう 44444 100 2 えええ ■ORACLEのバージョン  Oracle9i

  • GROUP BY と、ORDER BY

    ACCESS97を使用しています。 SQLで、GROUP BY と、ORDER BYの両方を使用することは可能でしょうか? Set DB = CurrentDb() strSQL = "SELECT 製造番号 FROM 入庫データ WHERE " strSQL = strSQL + "整理NO='" & Me.整理NO入力 & "'" strSQL = strSQL + "GROUP by 製造番号" & ";"      ← ※ 'strSQL = strSQL + "ORDER by 製造番号" & ";" ※部分に入れる記号がわかりません。 ' ? ,?それとも順序が違うのでしょうか?

  • グループ化したいのですが

    テーブルAに以下のような項目があります。 [ID][SEI][MEI] やりたい事は、 ・[ID]ごとにグループ化して1行にまとめたい。 ・[SEI]と[MEI]をつなげて1つの項目として表示させたい。 これを実現させるには、どういうSQLを書けば良いでしょうか? 私が試したのは、以下のSQL文です。 SELECT ID,MIN(SEI) + MIN(MEI) AS NAME FROM TABLEA GROUP BY ID でも、これだと同じIDが複数存在すると[SEI][MEI]が別人のものがくっついてしまいます。当然ですが。 グループ化する前に[SEI][MEI]を連結させる処理が必要なのだろうと思うのですが、それをどうすれば良いのかが分かりません...。 どうかよろしくお願いします。m(_ _)m

  • GROUP BY で列名は指定できないの?

    いつもお世話になっております。 SQLで GROUP BY を使うときに SELECT部分で指定した 列名を指定したいことがよくあると思います。 列名を指定する方法はないのでしょうか? 例) SELECT 項目A, CASE WHEN 項目B = 1 THEN '○' WHEN 項目B IN (2,3) THEN '×' END AS 丸バツ, SUM(数量) FROM TABLE GROUP BY 項目A, 丸バツ こんな風にGROUP BYで指定したいのですが・・・。

  • sqlserverにはグループ集計のfirstとlastがありません??

    accessユーザーです sqlserverに組み替えているなかでaccessでは今までグループ集計をクエリーで作成していました select first(フィールド1) as AA,last(フィールド2) as BB  from FFテーブル group by フィールド3 ところがsqlserverにはfirstとlastがありません?? どのようにすればよいのかご教授おねがいします firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。 よろしくおねがいします

  • group by のソート

    mysql Client API version 3.23.49 PHP/4.4.5 で動作させようと思っています。 table a   b 1   2 3   4 2   4 7   1 2   6 1   6 上のデータから以下のような結果を得たいのですが table a   b  idcount1 1   6    2 3   4    1 2   6    2 7   1    1 グループで集計をとり、その上でbに6がある場合は6その他は bの値にNULLもしくは別の値が入るという形でいいのですが・・・ できません。 SELECT a, b, count( * ) AS idcount1 FROM table GROUP BY a するとはじめに読みこんだ値がbには入ってしまいます。 結果 table a   b  idcount1 1   2    2 3   4    1 2   4    2 7   1    1 SELECT a, b, count( * ) AS idcount1 FROM table where b=6 GROUP BY a するとbの値ははじきますし、カウントしている意味がなくなります。 結果 table a   b  idcount1 1   6    1 2   6    1 GROUP BY 処理前のソートを考え、from table後に oder by b=6 asc を使ったがエラー 末尾に oder by b=6 asc を使うと最初に試した値をソートするだけでした。 宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。