一下午就是為了這一句SQL!该怎么处理

一下午就是為了這一句SQL!快累死了!SELECTa.cnt_pass,DECODE(b.cnt_fail,NULL,0,b.cnt_fail)cnt_fail,e.lo

一下午就是為了這一句SQL!
快累死了!
SELECT       a.cnt_pass,   DECODE   (b.cnt_fail,   NULL,   0,   b.cnt_fail)   cnt_fail,
                  e.lob_no,   TO_CHAR   (SYSDATE,   'YYYY-MM-DD ')   today,   a.line,
                  (a.cnt_pass   +   DECODE   (b.cnt_fail,   NULL,   0,   b.cnt_fail))   total_cnt,
                  DECODE   (       ROUND   ((a.cnt_pass   /   (b.cnt_fail   +   a.cnt_pass))   *   100,   1)
                                  ||   '% ',
                                  '% ',   '100% ',
                                        ROUND   ((a.cnt_pass   /   (b.cnt_fail   +   a.cnt_pass))   *   100,   1)
                                  ||   '% '
                                )   pass_yield,
                  DECODE   (c.cnt_repair,   NULL,   0,   cnt_repair)   cnt_repair,
                  DECODE   (d.cnt_ng,   NULL,   0,   d.cnt_ng)   cnt_ng,
                      DECODE   (b.cnt_fail,   NULL,   0,   b.cnt_fail)
                  -   (     DECODE   (c.cnt_repair,   NULL,   0,   cnt_repair)
                        +   DECODE   (d.cnt_ng,   NULL,   0,   d.cnt_ng)
                      )   wait_repair,
                  DECODE   (ROUND   (     (     (     DECODE   (c.cnt_repair,   NULL,   0,   cnt_repair)
                                                            +   DECODE   (d.cnt_ng,   NULL,   0,   d.cnt_ng)
                                                          )
                                                      /   b.cnt_fail
                                                    )
                                                *   100,


                                                1
                                              ),
                                  NULL,   NULL,
                                        ROUND   (     (     (     DECODE   (c.cnt_repair,   NULL,   0,   cnt_repair)
                                                                  +   DECODE   (d.cnt_ng,   NULL,   0,   d.cnt_ng)
                                                                )
                                                            /   b.cnt_fail
                                                          )
                                                      *   100,
                                                      1
                                                    )
                                  ||   '% '
                                )   repair_yield
        FROM   (SELECT       SUM   (a.mb_cnt)   cnt_pass,   a.line
                            FROM   mb_cnt_by_time   a
                          WHERE   a.work_order= '06D000001E '
                              AND   a.dept   ||   a.station   =   'D50 '
                    GROUP   BY   a.line
                    ORDER   BY   a.line)   a,
                  (SELECT       line,   COUNT   (barcode_no)   cnt_fail
                            FROM   (SELECT   a.work_order,   a.line,   SUBSTR   (f.item_no,   5)   AS   gr,


                                                      a.barcode_no
                                            FROM   ng_barcode   a,
                                                      ng_component_info   b,
                                                      ng_error_info   c,
                                                      work_station   d,
                                                      work_order_info_detail   f,
                                                      data_station   i
                                          WHERE   station   =   10
                                              AND   d.work_station_id   =   i.work_station_id
                                              AND   i.data_status   =   'F '
                                              AND   a.work_order= '06D000001E '
                                              AND   a.barcode_id   =   b.barcode_id
                                              AND   b.component_id   =   c.component_id(+)
                                              AND   a.station   =   d.work_station_id
                                              AND   a.work_order   =   f.work_order
                                              AND   f.TYPE   =   'D '
                                        UNION   ALL
                                        SELECT   work_order,   line,   model   AS   gr,   a.barcode_no


                                            FROM   repair_info   a
                                          WHERE   dept   =   'D '
                                              AND   SUBSTR   (test_no,   1,   1)   =   'T '
                                              AND   WORK_ORDER= '06D000001E ')
                    GROUP   BY   line)   b,
                  (SELECT       COUNT   (DISTINCT   a.barcode_no)   cnt_repair,   a.line
                            FROM   repair_info   a,
                                      (SELECT   code,   descript   rma_des,   responsibility_dept,
                                                      issue_belong
                                            FROM   repair_code_des
                                          WHERE   codetype   <>   'E ')   b,
                                      (SELECT   code   ERROR_CODE,   descript   error_des
                                            FROM   repair_code_des
                                          WHERE   codetype   =   'E ')   c
                          WHERE   a.code   IS   NOT   NULL
                              AND   SUBSTR   (a.status,   2,   1)   ||   SUBSTR   (a.status,   5,   2)   =   'D30 '
                              AND   dept   =   'D '
                              AND   WORK_ORDER= '06D000001E '
                              AND   complete_date   IS   NOT   NULL
                              AND   a.code   =   b.code(+)


                              AND   bad_code   =   ERROR_CODE(+)
                    GROUP   BY   a.line
                    ORDER   BY   a.line)   c,
                  (SELECT       COUNT   (DISTINCT   a.barcode_no)   cnt_ng,   a.line
                            FROM   ng_barcode   a,
                                      ng_component_info   b,
                                      ng_error_info   c,
                                      work_station   d,
                                      repair_code_des   g,
                                      machine_test_info   h,
                                      data_station   i
                          WHERE   repair_date   IS   NOT   NULL
                              AND   station   =   10
                              AND         SUBSTR   (i.data_station_no,   1,   1)
                                      ||   SUBSTR   (i.data_station_no,   2,   2)   =   'D30 '
                              AND   g.code   =   b.repair_code
                              AND   d.work_station_id   =   h.work_station_id
                              AND   a.barcode_no   =   h.barcode_no
                              AND   d.work_station_id   =   i.work_station_id
                              AND   i.data_status   =   'F '
                              AND   (a.WORK_ORDER= '06D000001E '
                                      )
                              AND   a.barcode_id   =   b.barcode_id


                              AND   b.component_id   =   c.component_id(+)
                              AND   a.station   =   d.work_station_id
                    GROUP   BY   a.line
                    ORDER   BY   a.line)   d,
                  mes_bn1.line_info   e
      WHERE   a.line   =   b.line(+)
          AND   a.line   =   c.line(+)
          AND   a.line   =   d.line(+)
          AND   e.line_desc   =   a.line
          AND   e.unit_no   =   'S '
ORDER   BY   e.lob_no,   a.line


[解决办法]
UP
[解决办法]
够复杂

不知道效率咋样
[解决办法]
高,实在是高!~~~
[解决办法]
挺复杂的,支持一下楼主,佩服这样的精神~
不过,能不能分出几条简单的sql啊,这样的话,以后维护或者什么的都很方便~
难道非要用一条sql语句来实现嘛?
[解决办法]
用toad format过---^_^
[解决办法]
...看来业务逻辑比较复杂!
[解决办法]
偶怕怕......
[解决办法]
DECODE (b.cnt_fail, NULL, 0, b.cnt_fail)
这句可以简化为
nvl(b.cnt_fail, 0)
[解决办法]
DECODE (b.cnt_fail, NULL, 0, b.cnt_fail)

楼上所说的及是啊,呵呵,完全没有必要 用decode 吧!
没有实际环境,实在是很不喜欢看啊!
[解决办法]
这是为实现啥功能写的?
[解决办法]
把业务理清楚再说.
[解决办法]
还好了,不是很复杂,我曾经在C++里面写过一个将近1000行的文件,动态拼SQL语句,没写死我撒!
[解决办法]
IS NOT NULL啥的也可以改改
[解决办法]
up