みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

月間集計ですべての日付を抽出するには

Oracle9iで開発をしております。

月間集計をするにあたり、SQLをどのように書けばよいのか質問させていただきたいと思います。

たとえば、COUNTテーブルというテーブルがあり
年月日 カウント数
2005/09/01 1000
2005/09/01 1000
2005/09/02 2000
2005/09/03 3000
2005/09/05 5000
2005/09/06 6000

というようにデータが入っていたとします。
現在、
SELECT 年月日, SUM(カウント数)
FROM COUNTテーブル
WHERE
COUNT_DATE BETWEEN TO_DATE(to_char(?||'/'||?||'/01')) AND LAST_DAY(TO_DATE(to_char(?||'/'||?||'/01')))
GROUP BY 年月日

としていまして、抽出されるデータは
2005/09/01 2000
2005/09/02 2000
2005/09/03 3000
2005/09/05 5000
2005/09/06 6000
となります。
ここで、2004/09/04や2005/09/07以降2005/09/30までのテーブルには存在
しない日付も抽出したいと思っています。
どのようにすれば抽出できるのでしょうか?

投稿日時 - 2005-09-28 18:29:36

QNo.1679209

すぐに回答ほしいです

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

過ちに気づいた。

select
nvl(年月日,to_date('??/??'||'/'||to_char(R,'dd'),'yy/mm/dd') 年月日,
nvl(カウント数,0) カウント数
(
select 年月日,SUM(カウント数) カウント数
from カウントテーブル
when trunc(年月日,'mm') = to_date('??/??','yy/mm')
group by 年月日
) X,
(select ROWNUM R from
(select * from (select * from dual union all select * from dual)) Y1,
(select * from (select * from dual union all select * from dual)) Y2,
(select * from (select * from dual union all select * from dual)) Y3,
(select * from (select * from dual union all select * from dual)) Y4,
(select * from (select * from dual union all select * from dual)) Y5
) Z
where to_number(to_char(年月日(+),'dd') = R

投稿日時 - 2005-09-28 23:52:50

お礼

SQL付でのご回答ありがとうございます。
参考にして試行錯誤しながら抽出することができました。

投稿日時 - 2005-09-29 11:02:44

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

まったくテストしてない妄想したSQLです。

select 年月日,カウント数
(
select 年月日,SUM(カウント数) カウント数
from カウントテーブル
when trunc(年月日,'mm') = to_date('??/??','yy/mm')
group by 年月日
) X,
(select ROWNUM R from
(select * from (select * from dual union all select * from dual)) Y1,
(select * from (select * from dual union all select * from dual)) Y2,
(select * from (select * from dual union all select * from dual)) Y3,
(select * from (select * from dual union all select * from dual)) Y4,
(select * from (select * from dual union all select * from dual)) Y5
) Z
where to_number(to_char(年月日(+),'dd') = R

本当は、加工処理用に表関数(ユーザ関数)を作ると、
必要件数を導き出すための無駄な問い合わせを、
スッキリさせることができるのですが..

投稿日時 - 2005-09-28 23:46:10

ANo.2

カレンダー表の生成だけがネックと勝手に判断してしまいますが、表関数を使うとよいでしょう。

参考URL:http://pukiwiki.postcle.com/zange/index.php?%C9%BD%B4%D8%BF%F4%2F%A5%AB%A5%EC%A5%F3%A5%C0%A5%C6%A1%BC%A5%D6%A5%EB

投稿日時 - 2005-09-28 23:36:26

お礼

ご回答ありがとうございます。
表関数というものがあるのですね。
ユーザ関数は使えない状況なのでまた別件で検討してみたいと思います。

投稿日時 - 2005-09-29 11:01:06

ANo.1

SQLの細かい文法は苦手なので、概念だけ。

2005/9/1~2005/9/30までの値を返すダミー表をSELECTするSQLを作り、ご質問にあるSQLの結果表とOUTER JOIN(外部結合)してやれば良いです。

投稿日時 - 2005-09-28 22:07:53

お礼

早速のご回答ありがとうございます。
ダミー表参考になりました。

投稿日時 - 2005-09-29 10:57:01

あなたにオススメの質問