当前位置: 代码迷 >> PB >> 数据按周分组 按礼拜统计 的 PB报表
  详细解决方案

数据按周分组 按礼拜统计 的 PB报表

热度:34   发布时间:2016-04-29 07:15:14.0
数据按周分组 按星期统计 的 PB报表
在數據庫中有一個數據表,表结构如下:
DATE WEEKDAY NWEEK WORKER WNAME QTY HOUR
2012/3/1 星期四 W9 0927 小A 100 8
2012/3/1 星期四 W9 0929 小B 20 4
2012/3/5 星期一 W10 0927 小A 10 4

需要做一个报表(格式如下),NWEEK表示一年的第几周(W9表示第9周),按周分组后,再按星期几统计总数(QTY、HOUR)。
星期一到星期日都要显示,不管那天有没有数据都要显示(比如星期一在数据库中没有数据,但报表也会显示星期一)。此数据库用的是ORACLE,

W9 星期一 星期二 星期三 星期四 總數
WORKER WNAME QTY HOUR QTY HOUR QTY HOUR QTY HOUR QTY HOUR
0927 小A 100 8 100 8
0929 小B 20 4 20 4


W10 星期一 星期二 星期三 星期四 總數
WORKER WNAME QTY HOUR QTY HOUR QTY HOUR QTY HOUR QTY HOUR
0927 小A 10 4 10 4
0929 小B



------解决方案--------------------
有存储过程啊!
------解决方案--------------------
不管有没有数据都要显示的报表,如果要简单点,做个表 t_days(c1 date),从1990-2020(或更长一点,保证程序生命周期一定用不完就行,反正这张表占的空间对于整个数据库而言可以忽略),每天一条数据.

之后

select t_days.c1,......
from t_days,你原来的查询
where t_dyas.c1 = 你原来的查询.日期列(+)
and t_days.c1 符合你的时间条件;

ORACLE下,加这个日期条件的开销基本上可以忽略
------解决方案--------------------
留意,时间条件一定要加在 t_days.c1 

而不是在原来的查询中.

因为需要用(+),加在原来查询中的时间条件,会使(+)失去意义.

同时,因为类似上述的原因,一般的做法是,把原来整个个查询出来的东西作为一个查询来用.


如,原来是

select t1.c1 as c1,t2.c2 as c2,...,t100.c100 as c100
from t1...c100
where ......

你后面要做成

select t_dyas.c1,view_1.c100
from t_days,
(select t1.c1 as c1,t2.c2 as c2,...,t100.c100 as c100
from t1...c100
where ....../*其它条件在这里*/) as view_1
where t_days.c1 = view_1.时间(+)
and and t_days.c1 符合你的时间条件;

也就是,原来整个SQL做成 (your sql ) as view_1

  相关解决方案