• ベストアンサー

通番を振りたい

select a,b,sum(c) from test group by a,b このようなSQLで以下のような検索結果が 取れたとします。 A,A,10 A,B,20 A,C,30 B,C,10 B,C,20 ここで質問ですが、select句の'a'毎に以下のように 通番を振りたいと思います。これを実現するには どのようにSQLを書けばいいでしょうか? A,A,10 1 A,B,20 2 A,C,30 3 B,C,10 1 B,C,20 2

  • Oracle
  • 回答数4
  • ありがとう数15

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

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

...大変申し訳ないです。 SELECT a, b, sum(c), ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,sum(c)) RNO FROM TEST GROUP BY a,b ORDER BY a,b,sum(c),RNO

freshjive
質問者

お礼

おー!すばらしい!! まさに要件を満たしています! 100点満点を進呈したいところですが、 20ptで勘弁してくださいm(__)m

その他の回答 (3)

回答No.3

申し訳ありません。 記入漏れがありました。 SELECT a, b, sum(c), ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b,sum(c)) RNO FROM TEST GROUP BY a,b

回答No.2

たしか9i以降なら可能なはずです。 SELECT a, b, sum(c), ROW_NUMBER() OVER (PARTITION BY a ORDER BY a,b) RNO FROM TEST GROUP BY a,b

回答No.1

ご質問のように番号を振るのはムリだと思います。 連番を振りたい要件は? それによっては代案があると思いますが・・・

関連するQ&A

  • SELECTした結果に通番を振りたい

    PostgreSQL8.2で、 select * from XX order by 項目名で データ検索した結果に、1~nの通番を 振りたいのですが、ポスグレで実現する 方法はあるでしょか。

  • 【再】2)-SQL文の書き方を教えてください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=694458 先日この問題で投稿しましたが、未完成のため、再度要望を整理し、ご指導をお願いいたします。 W←tabel名:名称、日付、数量 明細データ:     名称   日付    数量 A   2003/10/01   200 B   2003/10/03   500 C   2003/10/10   4000 A   2003/10/03   200 A   2003/10/03   100 C   2003/10/15   100 B   2003/10/15   300 C   2003/10/15   50 B   2003/10/15   60 求めているクエリーのイメージ:    2003/10/15 時点 ================================================ 名称     当日数量     当月数量     A          0       300     B         360       860     C         150       4150 ------------------------------------------------- 先日教えてもらったSQL文、希望のクエリーを作れないです。 -------------------------------------------------- select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/15# group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from W where 日付 = #2003/10/15# group by 名称 ) group by 名称; このSQL文は、2番目のSelectのところでエラーが出る (From句の構文エラーです) -------------------------------------------------- 後、Accessバージョンによって、SQL文が変わるでしょうか?当方は、Access97を使っている。 ご指導をお願いいたします。

  • 重複項目を取得するSQL分

    SQL分でわからないことがあるので質問させてください。 Aというテーブルに、 番号と処理通番(ユニーク)の2つカラムがあります。 Aテーブルから重複した番号とその処理通番を 上から4件まで取得したいのですが、 ----------------------------- SELECT A.番号,A.処理通番 FROM A INNER JOIN (SELECT 番号 FROM A GROUP BY 番号 HAVING COUNT(*) > 1) AS B ON (A.番号 = B.番号) ORDER BY A.番号,A.処理通番 ----------------------------- のSQLでは重複した番号のデータを 全て取得してしまいます。 番号別に4件まで取得したいのですが、 どのようなSQLを書けば取得できますか? よろしくお願いします。

  • 重複データの抽出方法(複数項目)

    以下のようなテーブルからc列とd列のデータが重複しているレコードを取得したいために、以下のSQLを試してみました。 a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 02 |01 |01 |01 03 |02 |01 |03 04 |02 |02 |03 05 |01 |01 |02 06 |02 |02 |03 select * from テスト where c in (select c from テスト group by c,d having count(*)>1) and d in (select d from テスト group by c,d having count(*)>1) そうしたところ、以下の結果になってしまいました。 想定では、○のレコードだけ抽出できると思ったのです。 ×のレコードを抽出したくないのですが、SQLのどこが 間違っているのでしょうか? a列|b列|c列|d列 ---|---|---|--- 01 |01 |01 |01 ○ 02 |01 |01 |01 ○ 03 |02 |01 |03 × 04 |02 |02 |03 ○ 06 |02 |02 |03 ○ (使用DB)SQLServer2000

  • 複数の副問合わせにて、一つだけデータがない場合の対処法は?

    テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。

  • distinct句を使わずレコード総計を求めたい

    DB初心者です。 DISTINCT句を使わずに、group by句を使って 重複データを除いたレコード総計を求めたいと思い、 下記の用にSQL文を書いたのですがうまくいきません。 oracleではなく、DB2を使っているのですがSQL文として 可能なのか教えていただければと思い質問を致しました。 <例> テーブル名:商品DB 商品名 a a b b c だったら、重複を除いたレコード数は3になりますが、 select count(*) from 商品DB group by 商品名 とすると 2 2 1 となり、それぞれの商品の合計数が出てしまうので select count(*) from ( select 商品名 from 商品DB group by 商品名) と副問合せ(でよいのでしょうか?)をしてみると 入力が予想されるトークンには "AS" が含まれている可能性があります。とエラーになってしまいました。

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

  • テーブルの結合について

    以下の二つを実行すると、2 の方がかなり速いのですが理由が分かりません。 分かる方教えてもらっていいですか? DBはMYSQLでInoDBです。 ちなみに Aは1万件、B は10万件ほど 1 のSQL SELECT * FROM A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) B ON A.id = B.XXX WHERE ・・・ GROUP BY A.id 2 のSQL (SELECT * FROM A ・・・ GROUP BY ID ) A LEFT JOIN (SELECT * FROM B WHERE ・・・ GROUP BY XXX) ON A.ID = B.XXX.ID

  • accessでDISTINCT 句と矛盾

    IIFで置き換えをした結果をソートしようとしましたが、 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,c [Microsoft][ODBC Microsoft Access Driver] ORDER BY 句 (c) が DISTINCT 句と矛盾しています。 というエラーになりました。 正しいSQLを教えてください。 SELECT DISTINCT a,IIF(IsNull(b), 0, 1) AS c FROM shain ORDER BY a,b も試しましたが同じようにエラーになりました。

  • 売り上げ集計SQLが作れません

    1つのTABLEに、1日の売上げ高を商品ごとに登録していくDBがあります。 簡単な構造は以下のとおりです。 日付       |A品売上額  |B品売上額 | 2008/11/01 |500000    |600000   | 2008/11/02 |450000    |800000   | 2008/11/03 |100000    |700000   | ・・・ 2008/11/30 |200000    |500000   | 2008/12/01 |300000    |100000   | <質問> それぞれの商品の1ヶ月売上高をSQLで抽出したいと思うのですが、Group byで何を指定したらいけるのかわからず困っています。 SQLで計算せずに抽出だけ行って、CGI側で計算するしかないのでしょうか? アドバイスお願いいたします。 <最初に考えたSQL(Group byがないためエラーになりました)> select sum(a),sum(b) from uriage where date between '2008/11/01' AND '2008/11/30';