mysql - 关于重构sql查询

标签 mysql sql database oracle

我有以下查询,虽然它达到了预期的结果,但它很长,请告诉我是否有任何其他方法可以重组我的查询..我想将这个长查询减少为较小的形式

    SELECT final_lines.line_number line_number, 
       final_lines.line_desc   line_desc, 
       Sum(final_lines.value)  value 
FROM   (SELECT main.line_code                          line_number, 
               main.line_desc                          line_desc, 
               ( COALESCE(main.net_sales, 0) 
                 + COALESCE(paid_out.paidout_amt, 0) ) value 
        FROM   (SELECT t.line_num       line_num, 
                       t.line_code      line_code, 
                       t.line_desc      line_desc, 
                       Sum(t.net_sales) net_sales 
                FROM   (SELECT pstl.prgp_id                    AS line_num, 
                               line.prgp_code                  AS line_code, 
                               line.prgp_desc                  AS line_desc, 
                               COALESCE(Sum(txn.txn_sales), 0) AS Net_Sales 
                        FROM   prodgp_str_link pstl 
                               JOIN prodgp_structure pstr 
                                 ON pstl.pstr_id = pstr.pstr_id 
                               JOIN product_group line 
                                 ON line.prgp_id = pstl.prgp_id 
                               LEFT JOIN prod_pgrp_link ppgl 
                                      ON pstl.prgp_child_id = ppgl.prgp_id 
                               LEFT JOIN product prd 
                                      ON prd.prod_id = ppgl.prod_id 
                               LEFT JOIN (SELECT dtl.txde_sku_code sku_code, 
                                                 CASE 
                                                   WHEN dtl.txde_level5_id IN ( 
                                                        'D100-5', 'D100-4', 
                                                        'D100-7', 
                                                        'D100-6', 
                                                        'D11-11', 'D11-1', 
                                                        'D5-1', 
                                                        'D5-5', 
                                                        'D100-10', 'D100-11', 
                                                        'D100-69' 
                                                        , 'D100-9' 
                                                        , 
                                                        'D100-100', 'D5-69', 
                                                        'D100-8', 
                                                        'D11-69', 
                                                        'D100-1', 'D100-3', 
                                                        'D100-2' ) 
                                                              THEN 
                                                   COALESCE (Sum( 
                                                   CASE 
                                                     WHEN dtl.txde_line_refund
= 
                                                          0 THEN 
                                                     dtl.txde_price_sold * 
                                                     dtl.txde_quantity_sold 
                                                     ELSE dtl.txde_price_sold * 
               dtl.txde_quantity_sold *- 1 
               END), 0) 
               ELSE COALESCE(Sum(CASE 
               WHEN dtl.txde_line_refund = 0 
               THEN 
               dtl.txde_value_line 
               ELSE dtl.txde_value_line *- 1 
               END), 0) 
               END               txn_sales 
               FROM   txn_detail dtl 
               JOIN txn_header hdr 
               ON dtl.orgu_code_cmpy = hdr.orgu_code_cmpy 
               AND dtl.orgu_code = hdr.orgu_code 
               AND dtl.till_short_desc = hdr.till_short_desc 
               AND dtl.txhd_txn_nr = hdr.txhd_txn_nr 
               JOIN txn_header_wag txhw 
               ON hdr.orgu_code_cmpy = txhw.orgu_code_cmpy 
               AND hdr.orgu_code = txhw.orgu_code 
               AND hdr.till_short_desc = txhw.till_short_desc 
               AND hdr.txhd_txn_nr = txhw.txhd_txn_nr 
               WHERE  hdr.txhd_txn_type IN ( 3, 8 ) 
               AND dtl.txde_detail_type IN ( 
               '1', '2', '3', '201', 
               '202', '203', '204', '205', 
               '206', '207', '208', '210', 
               '211' ) 
               AND txhw.txhw_processed_date = '20121112' 
               AND hdr.txhd_state = 0 
               AND hdr.txhd_training_mode = 0 
               AND hdr.txhd_voided = 0 
               AND dtl.txde_item_void = 0 
               GROUP  BY dtl.txde_sku_code, 
               dtl.txde_level5_id) txn 
               ON prd.prod_sku = txn.sku_code 
               WHERE  pstl.pstr_id = 3 
               AND pstr.pstr_is_live = 1 
               AND pstl.prgp_parent_id = 0 
               AND line.prgp_code IN ( '30', '50', '60' ) 
               GROUP  BY pstl.prgp_id, 
               line.prgp_code, 
               line.prgp_desc 
               UNION ALL 
               SELECT pstl.prgp_id                     AS line_num, 
               line.prgp_code                   AS line_code, 
               line.prgp_desc                   AS line_desc, 
               COALESCE(Sum(txn5.txn_sales), 0) AS Net_Sales 
               FROM   prodgp_str_link pstl 
               JOIN prodgp_structure pstr 
               ON pstl.pstr_id = pstr.pstr_id 
               JOIN product_group line 
               ON line.prgp_id = pstl.prgp_id 
               LEFT JOIN product_group child 
               ON pstl.prgp_child_id = child.prgp_id 
               LEFT JOIN (SELECT 
               dtl.txde_level5_id level5id, 
               CASE 
               WHEN dtl.txde_level5_id IN ( 
               'D100-5', 'D100-4', 'D100-7', 
               'D100-6', 
               'D11-11', 'D11-1', 'D5-1', 
               'D5-5', 
               'D100-10', 'D100-11', 'D100-69' 
               , 'D100-9' 
               , 
               'D100-100', 'D5-69', 'D100-8', 
               'D11-69', 
               'D100-1', 'D100-3', 'D100-2' ) 
                   THEN 
               COALESCE (Sum(CASE 
               WHEN dtl.txde_line_refund = 0 THEN 
               dtl.txde_price_sold * 
               dtl.txde_quantity_sold 
               ELSE dtl.txde_price_sold * 
               dtl.txde_quantity_sold *- 1 
               END), 0) 
               ELSE COALESCE(Sum(CASE 
               WHEN dtl.txde_line_refund = 0 
               THEN 
               dtl.txde_value_line 
               ELSE dtl.txde_value_line *- 1 
               END), 0) 
               END                txn_sales 
               FROM   txn_detail dtl 
               JOIN txn_header hdr 
               ON dtl.orgu_code_cmpy = hdr.orgu_code_cmpy 
               AND dtl.orgu_code = hdr.orgu_code 
               AND dtl.till_short_desc = hdr.till_short_desc 
               AND dtl.txhd_txn_nr = hdr.txhd_txn_nr 
               LEFT JOIN txn_taxes tax 
               ON dtl.orgu_code_cmpy = tax.orgu_code_cmpy 
               AND dtl.orgu_code = tax.orgu_code 
               AND dtl.till_short_desc = 
               tax.till_short_desc 
               AND dtl.txhd_txn_nr = tax.txhd_txn_nr 
               AND dtl.txde_detail_nr = tax.txtx_detail_nr 
               JOIN txn_header_wag txhw 
               ON hdr.orgu_code_cmpy = txhw.orgu_code_cmpy 
               AND hdr.orgu_code = txhw.orgu_code 
               AND hdr.till_short_desc = txhw.till_short_desc 
               AND hdr.txhd_txn_nr = txhw.txhd_txn_nr 
               WHERE  hdr.txhd_txn_type IN ( 3, 8 ) 
               AND dtl.txde_level5_id IS NOT NULL 
               AND dtl.txde_sku_code IS NULL 
               AND dtl.txde_detail_type IN ( 
               '1', '2', '3', '201', 
               '202', '203', '204', '205', 
               '206', '207', '208', '210', 
               '211' ) 
               AND txhw.txhw_processed_date = '20111212' 
               AND hdr.txhd_state = 0 
               AND hdr.txhd_training_mode = 0 
               AND hdr.txhd_voided = 0 
               AND dtl.txde_item_void = 0 
               GROUP  BY dtl.txde_level5_id) txn5 
               ON child.prgp_code = txn5.level5id 
               WHERE  pstl.pstr_id = 3 
               AND pstr.pstr_is_live = 1 
               AND pstl.prgp_parent_id = 0 
               AND line.prgp_code IN ( '30', '50', '60' ) 
               GROUP  BY pstl.prgp_id, 
               line.prgp_code, 
               line.prgp_desc) t 
                GROUP  BY t.line_num, 
                          t.line_code, 
                          t.line_desc 
                ORDER  BY t.line_code) main 
               LEFT JOIN (SELECT t.line_code      line_code, 
                                 t.line_desc      line_desc, 
                                 Sum(t.net_sales) paidout_amt 
                          FROM   (SELECT pstl.prgp_id                    AS 
                                         line_num, 
                                         line.prgp_code                  AS 
                                         line_code, 
                                         line.prgp_desc                  AS 
                                         line_desc, 
                                         COALESCE(Sum(txn.txn_sales), 0) AS 
                                         Net_Sales 
                                  FROM   prodgp_str_link pstl 
                                         JOIN prodgp_structure pstr 
                                           ON pstl.pstr_id = pstr.pstr_id 
                                         JOIN product_group line 
                                           ON line.prgp_id = pstl.prgp_id 
                                         LEFT JOIN prod_pgrp_link ppgl 
                                                ON pstl.prgp_child_id = 
                                                   ppgl.prgp_id 
                                         LEFT JOIN product prd 
                                                ON prd.prod_id = ppgl.prod_id 
                                         LEFT JOIN (SELECT dtl.txde_sku_code 
                                                           sku_code 
                                                           , 
                                                           COALESCE( 
                                                   Sum(hdr.txhd_value_nett), 0) 
                                                           txn_sales 
                                                    FROM   txn_detail dtl 
                                                           JOIN txn_header hdr 
                                                             ON 
                                                   dtl.orgu_code_cmpy = 
                                                   hdr.orgu_code_cmpy 
                                                   AND 
                                                   dtl.orgu_code =
hdr.orgu_code 
                                                                AND 
                                                   dtl.till_short_desc 
                                                   = 
                                                   hdr.till_short_desc 
                                                                AND 
                                                   dtl.txhd_txn_nr = 
                                                   hdr.txhd_txn_nr 
                                                           JOIN txn_header_wag 
                                                                txhw 
                                                             ON 
                                                   hdr.orgu_code_cmpy = 
                                                   txhw.orgu_code_cmpy 
                                                   AND 
                                                   hdr.orgu_code = 
                                                   txhw.orgu_code 
                                                                AND 
                                                   hdr.till_short_desc 
                                                   = 
       txhw.till_short_desc 
       AND hdr.txhd_txn_nr = 
       txhw.txhd_txn_nr 
       WHERE  hdr.txhd_txn_type = 10 
       AND dtl.txde_detail_type IN ( 
       '1', '2', '3', '201', 
       '202', '203', '204', '205', 
       '206', '207', '208', '210', 
       '211' ) 
       AND txhw.txhw_processed_date = 
       '20111212' 
       AND hdr.txhd_state = 0 
       AND hdr.txhd_training_mode = 0 
       AND hdr.txhd_voided = 0 
       AND dtl.txde_item_void = 0 
       GROUP  BY dtl.txde_sku_code) txn 
       ON prd.prod_sku = txn.sku_code 
       WHERE  pstl.pstr_id = 3 
       AND pstr.pstr_is_live = 1 
       AND pstl.prgp_parent_id = 0 
       AND line.prgp_code IN ( '30', '50', '60' ) 
       GROUP  BY pstl.prgp_id, 
       line.prgp_code, 
       line.prgp_desc) t 
       GROUP  BY t.line_num, 
       t.line_code, 
       t.line_desc 
       ORDER  BY t.line_code) paid_out 
       ON main.line_code = paid_out.line_code) final_lines 
GROUP  BY line_number, 
          line_desc  

最佳答案

您可以将其拆分为您为其创建 View 的逻辑组件。

例如:

  LEFT JOIN
    (SELECT dtl.txde_sku_code sku_code , COALESCE( SUM(hdr.txhd_value_nett), 0) txn_sales FROM txn_detail dtl
    JOIN txn_header hdr ON dtl.orgu_code_cmpy      = hdr.orgu_code_cmpy AND dtl.orgu_code = hdr.orgu_code AND
      dtl.till_short_desc                          = hdr.till_short_desc AND dtl.txhd_txn_nr = hdr.txhd_txn_nr
    JOIN txn_header_wag txhw ON hdr.orgu_code_cmpy = txhw.orgu_code_cmpy AND hdr.orgu_code = txhw.orgu_code AND
      hdr.till_short_desc                          = txhw.till_short_desc AND hdr.txhd_txn_nr = txhw.txhd_txn_nr
    WHERE hdr.txhd_txn_type                        = 10
    AND dtl.txde_detail_type                      IN ( '1', '2', '3', '201', '202', '203', '204', '205', '206',
      '207', '208', '210', '211' )
    AND txhw.txhw_processed_date = '20111212'
    AND hdr.txhd_state           = 0
    AND hdr.txhd_training_mode   = 0
    AND hdr.txhd_voided          = 0
    AND dtl.txde_item_void       = 0
    GROUP BY dtl.txde_sku_code
    ) txn ON prd.prod_sku = txn.sku_code

可以替换为:

CREATE OR REPLACE VIEW sum_sales_by_date_sku_code 
AS
SELECT txhw.txhw_processed_date processed_date,dtl.txde_sku_code sku_code , COALESCE( SUM(hdr.txhd_value_nett), 0) txn_sales FROM txn_detail dtl
    JOIN txn_header hdr ON dtl.orgu_code_cmpy      = hdr.orgu_code_cmpy AND dtl.orgu_code = hdr.orgu_code AND
      dtl.till_short_desc                          = hdr.till_short_desc AND dtl.txhd_txn_nr = hdr.txhd_txn_nr
    JOIN txn_header_wag txhw ON hdr.orgu_code_cmpy = txhw.orgu_code_cmpy AND hdr.orgu_code = txhw.orgu_code AND
      hdr.till_short_desc                          = txhw.till_short_desc AND hdr.txhd_txn_nr = txhw.txhd_txn_nr
    WHERE hdr.txhd_txn_type                        = 10
    AND dtl.txde_detail_type                      IN ( '1', '2', '3', '201', '202', '203', '204', '205', '206',
      '207', '208', '210', '211' )
AND hdr.txhd_state           = 0
AND hdr.txhd_training_mode   = 0
AND hdr.txhd_voided          = 0
AND dtl.txde_item_void       = 0
GROUP BY dtl.txde_sku_code;

查询部分将更改为:

 LEFT JOIN sum_sales_by_sku_code  tnx ON prd.prod_sku = txn.sku_code
 WHERE tnx.processed_date = '20111212'

关于mysql - 关于重构sql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13348443/

相关文章:

mysql - MySQL 中的行版本控制

MySQL,存储过程,差异设置局部变量

sql - SQL-GROUP BY和COALESCE的丑陋组合

python - Python中SQL-IN的使用

c# - 使用 Visual Studio 和 NUnit 连接到 localdb

mysql - 计算员工上个月在工作场所花费的每天平均小时数

mysql - inner join更新sql出错

mysql - 如何计算 SQL 中的平均日期?

java - Hibernate生产使用警告

database - "Reference Data"的反义词是什么?