- PR -

集計について

投稿者投稿内容
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-07-20 18:10
Oracle10gで集計を行っています。
集計内容は、
2005/7/1〜2005/7/31までの範囲で日付毎の集計を取りたいと思っております。
そこで過去ログを参考にし
テストで20050701〜20050703の範囲でSELECT文を結合したところ
まったくデータがない場合、なにも表示されませんでした

SELECT count(nvl(ID,0))
FROM TABLE_A
WHERE Date = 20050701
  〜
SELECT count(nvl(ID,0))
FROM TABLE_A
WHERE Date = 20050703

どうしたら0件も抽出できるのかご教授ください。
117
ベテラン
会議室デビュー日: 2005/05/09
投稿数: 94
お住まい・勤務地: 大阪府
投稿日時: 2005-07-20 18:20
引用:

SELECT count(nvl(ID,0))
FROM TABLE_A
WHERE Date = 20050701
  〜
SELECT count(nvl(ID,0))
FROM TABLE_A
WHERE Date = 20050703



GROUP BY句でDate列でグループ化するのはダメでしょうか?
_________________
# Future Is On Fire !
ばなな
ベテラン
会議室デビュー日: 2005/06/16
投稿数: 91
投稿日時: 2005-07-20 18:34
説明不足で申し訳ございません
集計結果を2005/7/1〜2005/7/31まで

2005年7月
日付  1 | 2 | 3 | 4 | 5 ・・・
件数  0 | 1 | 0 | 5 | 1 ・・・
GroupByに日付も加えていたのですが、上記のように0件でもカウントしたかったので
UNIONで1日〜31日を結合しました。
何か良い方法はないでしょうか?
ご指導のほどよろしくお願いいたします。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-07-20 19:03
試していませんがこんな感じです?

select
( select count(id) from table_a where date = 20050701 ) count01 ,
( select count(id) from table_a where date = 20050702 ) count02 ,
( select count(id) from table_a where date = 20050703 ) count03 ,
 <以下略>
from dual ;

-----------------------------
count関数を使っていて0件の時に出ない・・・って不思議な気がしたのは私だけでしょうか?

引用:

SELECT count(nvl(ID,0))
FROM TABLE_A
WHERE Date = 20050701


で条件マッチするデータが存在しない場合、0が返ると思うんですが・・・。

0をUNIONしたからデータが表示されないってあるんですかね?

#私が無知なだけかもしれませんが。
ぷさいくろう
ぬし
会議室デビュー日: 2006/08/30
投稿数: 1034
投稿日時: 2006-09-26 14:53
引用:

夏椰さんの書き込み (2005-07-20 19:03) より:
試していませんがこんな感じです?

select
( select count(id) from table_a where date = 20050701 ) count01 ,
( select count(id) from table_a where date = 20050702 ) count02 ,
( select count(id) from table_a where date = 20050703 ) count03 ,
 <以下略>
from dual ;



select sum(decode(date,20050701,1,0)) count01 ,
sum(decode(date,20050702,1,0)) count02
from table_a
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-26 16:16
一言で「集計する」といっても。1日ごとのデータの件数(行数)を集計したいのか
ID列値(数値?)を集計したいのか、どっちなんですかね?

前者ならCOUNTだし。
SELECT DATE, COUNT(*) FROM TABLE_A GROUP BY DATE
※COUNT(列名)と書いた場合、列の値がnullだと集計対象から外れるのでCOUNT(*)

後者ならSUMだし。
SELECT DATE, SUM(COALESCE(ID, O)) FROM TABLE_A GROUP BY DATE
vincent
大ベテラン
会議室デビュー日: 2004/07/09
投稿数: 142
投稿日時: 2006-09-26 16:17
行と列を逆にしたければWHEREで絞ってUNIONで連結してね。
(でもこういう"横持ち"ってあんま好みじゃないな)
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2006-09-26 21:29
手持ちのおもちゃ箱から発見!
コード:
/*
	連続する日付を取得するSQL
*/
select 
	to_date('2006/1/1') + rownum-1 as day_of_year
from
	all_catalog c
where
	to_date('2006/1/1') + rownum-1 <= to_date('2006/12/31')



1.Group byで日単位に集計した結果のInline Viewと連続する日付を取得するInline Viewを外部結合する。
2.NULLの場合はNVL()で0にする。

ってのはどう?
行と列が反転はしていないけど、それはプログラム側でやるってことで。
#all_catalogのデータ数が結構あるので、数年の連続データなら問題なく作れると思う。

スキルアップ/キャリアアップ(JOB@IT)