
はじめまして。
SQLで部分的にGROUP BYで集計したいのですが、
どうもしっくりくるSQLがかけません。
多分CASEあたりを使うと綺麗で高速なSQLがかけると思っています。
皆様のお知恵をお借りしたく投稿しました。
具体的には以下のような出納帳データで
出納帳
日付 金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -1000
2012/8/21 -2000
2012/8/22 3000
2012/8/23 4000
2012/8/24 -3000
2012/8/24 -4000
2012/8/27 5000
↓集計
日付 金額
2012/8/20 1000
2012/8/20 2000
2012/8/21 -3000(-1000と-2000を集約)
2012/8/22 3000
2012/8/23 4000
2012/8/24 -7000(-3000と-4000を集約)
2012/8/27 5000
というように、マイナスの金額は集約してしまいたいのですが、どのようなSQLが最適でしょうか?
とりあえず、UNIONかなと思い、
(SELECT 日付, 金額
FROM 出納帳
WHERE 金額>=0
UNION ALL
SELECT 日付, 金額
FROM 出納帳
WHERE 金額<0
GROUP BY 日付 )
ORDER BY 日付
とプラス金額とマイナス金額にわけUNIONしたのですが、
もっと綺麗(高速)にやる方法があるのではないか?と思い投稿いたしました。
なにかヒントございましたら、ご教授ください。
DB環境:Oracle 11g
No.2ベストアンサー
- 回答日時:
--綺麗かどうかはともかく、かなり無理やり
SELECT 日付, SUM(金額) AS 金額
FROM (
SELECT 日付, 金額,
ROW_NUMBER() OVER (PARTITION BY 日付 ORDER BY 金額) AS id
FROM 出納帳
)
GROUP BY 日付, CASE WHEN 金額 < 0 THEN 0 ELSE id END;
実は一意になるキーはすでにカラムにもっています。
それをGROUP BYのELSEに入れれば、うまくいきそうです!
素晴らしい回答ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
特定の列だけをGROUP BYしたい時
SQL Server
-
SELECT 文 GROUP での1件目を取得
SQL Server
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
GROUP BYを行った後に結合したい。
Oracle
-
6
一部のカラムでdistinctし全てのカラムを取得
MySQL
-
7
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
8
SELECT 文の NULL列は?
PostgreSQL
-
9
group byの並び順を変えるだけで結果が異なる
Oracle
-
10
「指定されたキャストは有効ではありません。」とエラーが出てしまいます。
Microsoft ASP
-
11
3つ以上のテーブルをUNIONするのは現時的でないでしょうか?
MySQL
-
12
単一グループのグループ関数ではありません。
Oracle
-
13
重複していないレコードの抽出方法について
MySQL
-
14
GROUP BYでエラーが発生
SQL Server
-
15
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
16
INSERT文でフィールドの1つだけを他のテーブルから取ってきた値を入れたい
その他(データベース)
-
17
ORA-01013のエラーについて経験のある方お願いします。
Oracle
-
18
CASE文のエラーについて
Oracle
-
19
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
20
SQL文で複数の項目のうちひとつの項目のみの重複を排除する方法を教えてください。
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DATE型の省略値について
-
SQLで部分的にGROUP BYしたいとき
-
oracle 文字列 01:45 を時間に...
-
Accessの数値から時間に変換す...
-
23時59分59秒までのデータを抽...
-
2016.3.2を日付として認識させたい
-
日付書式に変換でこまっています!
-
oracle 最新日付との比較
-
DB2のSQL(日付)について
-
Statement ignored というエラー
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
-
Accessで年月日のデータ...
-
sqlplusでヘッダーが付かない
-
SQL*Loaderでのsysdate使用
-
キャッシュを使わずにSELECTを...
-
日付型カラムへのデータINSERT
-
ACCESS、時間ごとの集計の仕方は?
-
ストアド実行時のエラー「参照...
-
callで順に実行されるプロシー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
重複するIDのデータを1行にま...
-
Accessの数値から時間に変換す...
-
SQLで部分的にGROUP BYしたいとき
-
wordの差し込み印刷での日付表示
-
SQLサーバで和暦から西暦に変換...
-
14桁の日付(YYYYMMDDHHMMSS)を...
-
日付型なら変数の先頭になん...
-
テーブルの主キーをdate型...
-
SQL ブレーク処理について
-
今日の日付が入った行のデータ...
-
23時59分59秒までのデータを抽...
-
DB2のSQL(日付)について
-
ExcelのSUMPRODUCTで日付の範囲...
-
日付書式に変換でこまっています!
-
4バイトの日付データを、16進数...
-
oracle 文字列 01:45 を時間に...
-
VARCHAR2とNUMBERで事足りる?
-
最新日付のデータを取得したい
-
日付の切り出し方法について
-
OSのシステム日付を変更して...
おすすめ情報