原表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天的天数个数的排序

解决方案 »

  1.   

    easy,decode就能实现,就是不知道现在CSDN还在抽筋嘛,贴都发不了
      

  2.   

    思路我已经有了,不过现在CSND下在抽筋,只看到回贴数在增加,就是看不见回贴,等正常了,现写,最好贴点数据
      

  3.   

    应该以下数据是根据city_day生成的,我写写看
    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天的天数个数的排序 
      

  4.   

    以下,如果某个城市去年上月没有数据,则相应的数据显示为null,如果不想这么显示,就用nvl
    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(+)
      

  5.   

    简单分析一下你的思路好吗? 
    excellent_days等用decode能实现,
    但orders又一个排序,没有思路了
      

  6.   

    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先用里面这句,生成每个城市的优,良,不好的天数
    出来结果应该是这样的
    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(+) 
    是考虑到可能当前有的城市纪录在上月或者以前不一定有,如果确认有的话,可以把(+)去掉