• ベストアンサー
  • 困ってます

SQL(oracle)での並べ替え

SQL(oracle)での並べ替えで質問がございます。 TABLE:AAA NO, NAM,GNo, DATE ------------------ 1, abc, 3, 09/01 2, bcd, 2, 08/25 3, cde, 2, 08/23 4, def, 3, 09/05 5, efg, 1, 09/03 6, fgh, 3, 08/21 のようなテーブルがあったときに、下記条件で並べ替えを したいと思っています。 1.GNo毎に最小のDATEを抽出し、各Gnoの最小のDATEのうち   小さいGNoのグループでソート。 2.1で同一GNo内ではDATEが小さい順にソート。 つまり、上記の例では、各GNoの最小のDATEは、 1・・・09/03 2・・・08/23 3・・・08/21 なので、これからDATEの小さい順に、GNoが 3、2、1の順にソートをします。各GNo毎にもDATEが小さい順に ソートをするので、結果として、 NO, NAM,GNo, DATE ------------------ 6, fgh, 3, 08/21 1, abc, 3, 09/01 4, def, 3, 09/05 3, cde, 2, 08/23 2, bcd, 2, 08/25 5, efg, 1, 09/03 のような順番にしたいのです。この結果のようにするには、 どのようなSQLにすればよいでしょうか? よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数180
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.3
  • jmh
  • ベストアンサー率23% (71/304)

SELECT t.* FROM AAA t ORDER BY MIN(t.DATE) OVER (PARTITION BY t.GNo), t.DATE でどうかしら? 結果を教えてください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答どうもありがとうございます。 このやり方で思うようなソートができました。 どうもありがとうございました。

関連するQ&A

  • 【Win Vista】アイコン自動配列を止めさせたいのですがどうやればいいんでしょうか?

    私の環境は Windows Vista HomeEdition Service Pack1 です。 アイコンの表示を詳細表示にしています。 そして、 abc.txt efg.txt というファイル並んで格納されているフォルダにbcd.txtというファイルをコピーしたとき、 abc.txt efg.txt bcd.txt と配置されず、並び替えも何もしていないのに自動的に abc.txt bcd.txt efg.txt という風に並べられてしまいます。 右クリックで自動並べ替えボタンでもあるのかと見てみたんですが、そういうものも見当たりません。 親切機能だと思うのですが、それがものすごく煩わしいです。 この自動整列を切る方法わかる人いましたら教えてください。

  • 件数をカウントして日付でソートするSQL

    こんなテーブルがあったとして、 テーブル名:shohin ------------------- type:文字列 create_date:日付 こんなデータになっていたとして type| create_date ----+----------- abc | 2004/02/01 abc | 2004/02/02 abc | 2004/02/03 hhh | 2004/01/30 xxx | 2004/01/12 xxx | 2004/01/13 xxx | 2004/01/14 xxx | 2004/01/15 xyz | 2004/01/01 xyz | 2004/01/05 このようなデータを出力したいのですが… (typeで集計して、create_dateの一番新しい日付でソート) type | count | create_date -----+-------+----------- abc | 3 | 2004/02/04 -----+-------+----------- hhh | 1 | 2004/01/30 -----+-------+----------- xxx | 4 | 2004/01/15 -----+-------+----------- xyz | 2 | 2004/01/05 これを一発で書くSQLって可能でしょうか? 副問い合わせを使えば出来るような気がするのですが、Group By した結果からさらに最新の日付を取得してソートというのがどうも上手く書けませんでした。 お分りになる方がいらっしゃいましたら、ぜひともご教示願います。

  • JavaScriptの配列について

    var old_array = Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); var new_array = Array('b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); のような配列があり、 abcと入力するとbcd DEFと入力するとEFG 012と入力すると!23 というようなものを作りたいのですがどうすればいいでしょうか。

その他の回答 (2)

  • 回答No.2

#1どののSQLだと、同一の最小DATEを持つGNoがあるとき、くしゃくしゃな結果に成るように思うんですよね。 select x."NO",x."NAM",x."GNo",x."DATE" from AAA x, ( select "GNo",min(R) sortkey from (select "GNo",row_number() over(order by "DATE","GNo") R from AAA) group by "GNo" ) y where x."GNo"=y."GNo" order by y.sortkey,x."DATE" ; とか select x."NO",x."NAM",x."GNo",x."DATE" from AAA x, ( select "GNo",min(R) sortkey from ( select "GNo",rownum R from (select "DATE","GNo" from AAA order by "DATE","GNo") ) group by "GNo" ) y where x."GNo"=y."GNo" order by y.sortkey,x."DATE" ; みたいに面倒なことしないと。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答どうもありがとうございます。 すみません、ちょっと試せなかったのですが、 ANo.3さんのやり方でうまくいきました。 どうもありがとうございました。

  • 回答No.1

見てわかりやすいのは以下のようなものでしょうか。 SELECT * FROM AAA a ORDER BY (SELECT MIN(DATE) FROM AAA WHERE GNo=a.GNo),DATE なお、Oracleのバージョンは書かれた方がいいと思いますよ。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

さっそくのご回答どうもありがとうございました。 試してみます。Oracleのバージョンは9iです。

関連するQ&A

  • 3文字取得して配列に格納するにはどうしたらいいのでしょうか?

    今日1日、考えましたがどのようにすればいいのか解らず時間だけが過ぎてしまい焦っています。 「abcdef1234」という文字列があります。 上記の文字列を下記のように配列にする事は可能でしょうか? ・abc ・bcd ・cde ・def ・ef1 ・f12 ・123 ・234 すみませんがご教授いただけませんでしょうか? 些細な事でも構いませんので宜しくお願いします。

    • ベストアンサー
    • Java
  • SQLの質問です。

    Oracle Database Express Editionを使って勉強中の者です。 商品TBL、予約TBL、明細TBLと3つのテーブルを使用して、商品に対して予約と受取の明細がきちんと出ているのか、件数を出すSQLを組みたいと思っています。 例えば、 【商品TBL:shohin】 shohin_no / shohin_nm / price ----------------------------- s001 / name1 / 1000 s002 / name2 / 1500 s003 / name3 / 2000 【予約TBL:yoyaku】 yoyaku_no / shohin_no / status(1:予約, 2:受取) ----------------------------- y001 / s001 / 1 y001 / s001 / 2 y002 / s001 / 1 y002 / s002 / 1 y002 / s002 / 2 【明細TBL:receipt】 shohin_no / status / receipt ----------------------------- s001 / 1 / abc.. s001 / 2 / def.. s002 / 1 / ghi.. 【想定結果】 商品NO / 予約数 / 予約明細数 / 受取数 / 受取明細数 ----------------------------- s001 / 2 / 1 / 1 / 1 s002 / 1 / 1 / 1 / 0 s003 / 0 / 0 / 0 / 0 としたいのですが、どうにも上手くいかず、下記のような結果が返ってきます。 【結果】 商品NO / 予約数 / 予約明細数 / 受取数 / 受取明細数 ----------------------------- s001 / 2 / 2 / 2 / 2 s002 / 1 / 1 / 1 / 0 s003 / 0 / 0 / 0 / 0 私が実行したSQLは下記です。 恐らく何か初歩的な所で間違っているような気がするのですが、自分では分からず…。 一体何がいけないのか、ご教授の程、よろしくお願い致します。 select shohin.shohin_no as "商品NO" ,count(yoyaku_1.shohin_no) as "予約数" ,count(receipt_1.shohin_no) as "予約明細数" ,count(yoyaku_2.shohin_no) as "受取数" ,count(receipt_2.shohin_no) as "受取明細数" from shohin ,(select * from yoyaku where yoyaku.status = '1') yoyaku_1 ,(select * from yoyaku where yoyaku.status = '2') yoyaku_2 ,receipt receipt_1 ,receipt receipt_2 where yoyaku_1.shohin_no(+) = shohin.shohin_no and yoyaku_2.shohin_no(+) = shohin.shohin_no and receipt_1.shohin_no(+) = yoyaku_1.shohin_no and receipt_1.status(+) = yoyaku_1.status and receipt_2.shohin_no(+) = yoyaku_2.shohin_no and receipt_2.status(+) = yoyaku_2.status group by shohin.shohin_no order by 1

  • 最新から100行のSELECT文

    タイトルわかりにくくてすみません・・・ logno | value 1 | abc 2 | bcd ・ ・ ・ 2000 | def 2001 | efg のようなデータがあるとします。(データは2002,2003とどんどん追加されます。) このとき、lognoが1902~2001(つまり最新から100行)のデータを読み込むSELECT文を教えてください。 SELECT * FROM table_name ORDER BY logno DESC LIMIT 100; のようにして今まで取り込んできましたが、これでは順序が逆になってしまいます。(2001,2000...の順になってしまう) 逆にならない方法を教えてください。

    • ベストアンサー
    • MySQL
  • 特定の文字数のデータだけを抽出するには

    PHP+MySQLでプログラムを製作しています。 SQLについては初心者です。 あるフィールドに格納されているデータが 特定の文字数のものだけを取り出したいのですが、 何か効率的なコーディング方法はありますでしょうか。 たとえば +-----+--------+ | no | test | +-----+--------+ | 01 | a | | 02 | ab | | 03 | abc | | 04 | def | | 05 | abcd | | 06 | efghij | +-----+--------+ の中から”test”フィールドのデータの長さが3である "abc"と"def"のデータだけを抜き出したいのです。 SQLだけでは不可能で、一旦全部読み込んでから プログラムで処理しなくてはいけないでしょうか。 何かよい方法をご存知の方がいらっしゃいましたら、 どうぞよろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • 指定した条件の組み合わせのSQL文

    SQLite バージョン3.7.10 を使用しています。 以下のようなテーブル構造で、 「t1」テーブルの全ての行と 「t6」テーブルのdateカラムの年の部分を グループ化して全ての組み合わせの 「t6」テーブルのamount の合計を出力したいのですが、 どのようなSQL文を書けば良いのでしょうか? 例えばこのデータ内容なら、以下のような結果が得たいです。 +------+-------+-------+ | year | t1_name | 合計 | +------+-------+-------+ | 2011 |t1_name1|  5000| +------+-------+------+ | 2012 |t1_name1| 10000| +------+-------+------+ | 2012 |t1_name2| 45000| +------+-------+------+ PRAGMA foreign_keys = ON; DROP TABLE IF EXISTS t6; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t6 ( no INTEGER PRIMARY KEY AUTOINCREMENT, t1_key TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE ); CREATE INDEX date on t6(date); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2011-01-01', 5000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2012-01-01', 10000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-01-01', 15000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-02-01', 30000); http://ideone.com/I1mMba

  • ソートしてからグループ化したいけれど・・・。

    SQL構文について質問させて下さい。 ABC │ID │DATE ------------------ XXX │aaa │02/01 YYY │bbb │02/02 YYY │aaa │02/03 と言うデータから、DATEが新しい(大きい)値を抽出し、 次に重複するIDを排除した結果を出したいです。 希望の検索結果は、 ABC │ID │DATE ------------------ YYY │bbb │02/02 YYY │aaa │02/03 となって欲しいのです。 単純にソートした後でIDでグループ化したいのですが、当然できなく、私の考えでは、 SELECT abc, id, max( date ) FROM `test` GROUP BY id ORDER BY date DESC なのですが結果は、 ABC │ID │DATE ------------------ YYY │bbb │02/02 XXX │aaa │02/03 と言う風になり、何故か、2行目の様にDATEに対して、ABCの値が別の行の ID:aaaの値になってしまってます。 どうしたら良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 2文字以上の重なっている文字列を抜き出す方法

    例えば、次のようなテーブルがあって、mojiretuカラムにおいて 他の行の文字列と2文字以上の重なっている部分の文字列を取得したいのです。 ただし条件があって下の場合だと、「ab」は1、2行目で重なっているのですが、 2行目の「ab」はそれで全ての(終結している)文字列なのでマッチさせないようにしたいです。 なので、このテーブルから取得したい文字列は 「cd」「bcd」「abc」「bc」「de」になります。できれば重なっている回数も含めて取得したい (「cd」2回、「bcd」1回、「abc」1回、「bc」1回、「de」1回、) のですが、どのようなSQLを記述すれば良いのでしょうか? [テーブル] mojiretuカラム abcd ab cde abcde xy

    • ベストアンサー
    • MySQL
  • VBからのsqlの呼び出し方

    VB6.0について質問です。。。 現在SQLを使用して二つのAccessファイルからデータを取得して CSV出力を行っているのですがかなり無駄な処理をしていそうなので もっと簡略化もしくは効率的に出来る方法はないですか? 取得する項目数が多いので以下のソースを何回も交互におこなっています>< ふたつの異なるデータベースをSQLで呼び出すのに毎回切断して接続の長々としたプログラムで見栄えもわるいです、、、 お知恵をおかしください。 dbs.Close Set MyWorkspace = Workspaces(0) 'iniファイルからmdbのパスを取得 Set dbs = MyWorkspace.OpenDatabase(PATH1) '指定のmdbファイルを開く Set ds = dbs.OpenRecordset("select XXX from abc where No = " & XXX & " ;") 'レコードカウントする tmp2 = tmp2 & ds.Fields(0).Value & "," dbs.Close Set MyWorkspace = Workspaces(0) Set dbs = MyWorkspace.OpenDatabase(PATH2) Set ds = dbs.OpenRecordset("select XXX from efg where No = " & XXX & " ;") tmp2 = tmp2 & ds.Fields(0).Value & "," ・ ・ ・

  • SQL文について

    SQLite バージョン3.7.10 を使用しています。 次のようなテーブル構造で、 PRAGMA foreign_keys = ON; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t2 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t2 (key, name) VALUES ('t2_key1', 't2_name1'); INSERT INTO t2 (key, name) VALUES ('t2_key2', 't2_name2'); CREATE TABLE t3 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t3 (key, name) VALUES ('t3_key1', 't3_name1'); INSERT INTO t3 (key, name) VALUES ('t3_key2', 't3_name2'); CREATE TABLE t4 ( year TEXT NOT NULL, t1_key TEXT NOT NULL, t3_key TEXT NOT NULL, percent INTEGER NOT NULL, UNIQUE(year, t1_key, t3_key), FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2011', 't1_key1', 't3_key1', 10); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key2', 50); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key1', 100); CREATE TABLE t5 ( no INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, t1_key TEXT NOT NULL, t2_key TEXT NOT NULL, t3_key TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t2_key) REFERENCES t2(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-01-01', 't1_key1', 't2_key1', 't3_key1', 3000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-02-02', 't1_key2', 't2_key1', 't3_key1', 2000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2012-01-01', 't1_key2', 't2_key1', 't3_key1', 5000); 例えばテーブル「t5」から、 dateカラム=’2011’ t1_keyカラム= (テーブル「t1」のt1_nameカラム=’t1_name1’のt1_key1) t2_keyカラム= (テーブル「t2」のt2_nameカラム=’t2_name1’のt2_key1) という条件の含まれてる全ての対応する行に、 テーブル「t4」のpercentカラムとテーブル「t5」のamountカラムを 掛け合わせた数値の合計を出力する。 ただしテーブル「t4」に対応するt1_keyとt3_keyがなければ、 percentを「0」としてamountと掛ける。 例えばこの条件だと '2011-01-01'と'2011-02-02'の2つの行のamountの合計を求めることになりますが、 '2011-01-01'の方は、テーブル「t4」にpercent「10」があるので 3000×(10/100)=300 '2011-02-02'の方は、テーブル「t4」にpercentがない(対応する行がない)ので 2000×(0/100)=0 合計 300+0=300 という結果が得たいです。 これはどのようなSQL文になるのでしょうか?

  • Oracle9i SQLについて

    Oracle9i SQLについて 環境:WinXP(SP3),Oracle9i,VB2005 受注のテーブルから未出荷で品番毎に一番早い納期の 受注数を取得したいのですが上手くいきません ご教授願います。 SQL出力結果イメージ 品番  納期   受注数 A 2010/06/01 6 B 2010/05/26 10 C 2010/05/24 1