原表CITY_DAY
id,
city, //城市
pollution_indeces,
main_pollutant,
grade,
status, //优 或者 良 或者 轻度污染
oper_date,//日期
show_state目的表T_CITY_ORDERS
oper_date,
stat_type,
cityid,
city,
excellent_days, //最近30天优的天数
fine_days, //最近30天良的天数
nogood_days, //最近30天轻度污染天数
orders, //最近30天优的天数个数的排序。
l_excellent_days, //去年同期30天优的天数
l_fine_days, //去年同期30天良的天数
l_nogood_days, //去年同期30天轻度污染的天数
l_orders, //去年同期30天优的天数个数的排序。
r_excellent_days, //上个月同期30天优的天数
r_fine_days, //上个月同期30天良的天数
r_nogood_days, //上个月同期30天轻度污染的天数
r_orders //上个月同期30天的天数个数的排序
id,
city, //城市
pollution_indeces,
main_pollutant,
grade,
status, //优 或者 良 或者 轻度污染
oper_date,//日期
show_state目的表T_CITY_ORDERS
oper_date,
stat_type,
cityid,
city,
excellent_days, //最近30天优的天数
fine_days, //最近30天良的天数
nogood_days, //最近30天轻度污染天数
orders, //最近30天优的天数个数的排序。
l_excellent_days, //去年同期30天优的天数
l_fine_days, //去年同期30天良的天数
l_nogood_days, //去年同期30天轻度污染的天数
l_orders, //去年同期30天优的天数个数的排序。
r_excellent_days, //上个月同期30天优的天数
r_fine_days, //上个月同期30天良的天数
r_nogood_days, //上个月同期30天轻度污染的天数
r_orders //上个月同期30天的天数个数的排序
解决方案 »
- 关于数据库服务器内存分配DBA请进,在线等。。。
- 急,关于oracle触发器实现唯一性约束的问题
- ESQL中这个where子句怎么写?
- Oracle 9i中的PL/SQL是否支持数组,如不支持该怎么半?
- 怎样用Oracle Database Assistant建立数据库?高手进
- 麻烦给一个9i的下载地址,不要是orcale网站的,我这里下载死慢 55个小时
- 怎样在Oracle9i中倒入Oracle8.0.5倒出的*.dmp文件!
- 傻傻地问,使用存储过程能提高检索速度吗?
- 如何实现以下功能?
- oracle 去重操作
- sqlldr求助
- 在ArcGIS Engine中如何创建一个组件实现把创建和管理geodatabase的API进行封装
city,
excellent_days, //最近30天优的天数
fine_days, //最近30天良的天数
nogood_days, //最近30天轻度污染天数
orders, //最近30天优的天数个数的排序。
l_excellent_days, //去年同期30天优的天数
l_fine_days, //去年同期30天良的天数
l_nogood_days, //去年同期30天轻度污染的天数
l_orders, //去年同期30天优的天数个数的排序。
r_excellent_days, //上个月同期30天优的天数
r_fine_days, //上个月同期30天良的天数
r_nogood_days, //上个月同期30天轻度污染的天数
r_orders //上个月同期30天的天数个数的排序
SELECT aaa.city, aaa.excellent_days, aaa.fine_days, aaa.nogood_days,
aaa.orders, ccc.l_excellent_days, ccc.l_fine_days, ccc.l_nogood_days,
ccc.l_orders, bbb.r_excellent_days, bbb.r_fine_days, bbb.r_nogood_days,
bbb.r_orders
FROM (SELECT aa.*,
ROW_NUMBER () OVER (ORDER BY aa.excellent_days DESC) orders
FROM (SELECT city, SUM (DECODE (status, '优', 1, 0)) excellent_days,
SUM (DECODE (status, '良', 1, 0)) fine_days,
SUM (DECODE (status, '轻度污染 ', 1, 0)) nogood_days
FROM city_day a
WHERE oper_date BETWEEN TRUNC (SYSDATE) - 30
AND TRUNC (SYSDATE) + 0.99999) aa) aaa,
(SELECT aa.*,
ROW_NUMBER () OVER (ORDER BY aa.r_excellent_days DESC)
r_orders
FROM (SELECT city,
SUM (DECODE (status, '优', 1, 0)) r_excellent_days,
SUM (DECODE (status, '良', 1, 0)) r_fine_days,
SUM (DECODE (status, '轻度污染 ', 1, 0)) r_nogood_days
FROM city_day a
WHERE oper_date BETWEEN ADD_MONTHS (TRUNC (SYSDATE), -1) - 30
AND ADD_MONTHS (TRUNC (SYSDATE) + 0.99999,
-1
)) aa) bbb,
(SELECT aa.*,
ROW_NUMBER () OVER (ORDER BY aa.l_excellent_days DESC)
l_orders
FROM (SELECT city,
SUM (DECODE (status, '优', 1, 0)) l_excellent_days,
SUM (DECODE (status, '良', 1, 0)) l_fine_days,
SUM (DECODE (status, '轻度污染 ', 1, 0)) l_nogood_days
FROM city_day a
WHERE oper_date BETWEEN ADD_MONTHS (TRUNC (SYSDATE), -12)
- 30
AND ADD_MONTHS (TRUNC (SYSDATE) + 0.99999,
-12
)) aa) ccc
WHERE aaa.city = bbb.city(+) AND aaa.city = bbb.city(+)
excellent_days等用decode能实现,
但orders又一个排序,没有思路了
SUM (DECODE (status, '良', 1, 0)) fine_days,
SUM (DECODE (status, '轻度污染 ', 1, 0)) nogood_days
FROM city_day a
WHERE oper_date BETWEEN TRUNC (SYSDATE) - 30
AND TRUNC (SYSDATE) + 0.99999先用里面这句,生成每个城市的优,良,不好的天数
出来结果应该是这样的
city excellent_days fine_days nogood_days
上海 11 13 6
北京 16 10 4然后再包层,用ROW_NUMBER () OVER (ORDER BY aa.excellent_days DESC) orders 来取按优的天数的城市排名
出来结果
city excellent_days fine_days nogood_days orders
上海 11 13 6 2
北京 16 10 4 1
这里也可以用里层先order by 一下,外层用rownum orders来实现,因为这里不需要分组排名
如果需要有并列的(优的天数一样)就把row_number() over 换成dense_rank() over
如果需要按excellent_days fine_days nogood_days 这样的排序顺序来排名
要这样写
over (ORDER BY aa.excellent_days, aa.fine_days ,aa.nogood_days DESC)上面第一段AAA是取当前30天的,
bbb是取上月的30天的
CCC是取去年同期的
最后根据城市关联
之所以用aaa.city = bbb.city(+)
是考虑到可能当前有的城市纪录在上月或者以前不一定有,如果确认有的话,可以把(+)去掉