这个sql select必须优化...如何?

0 mysql

这是我的查询

SELECT DISTINCT
    SM.sales_date,
    (SELECT 
            SUM(gross_sale)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TGROSS,
    (SELECT 
            SUM(net_sale)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TNET,
    (SELECT 
            SUM(cash)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TCASH,
    (SELECT 
            SUM(cheque)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TCHEQUE,
    (SELECT 
            SUM(credit)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TCREDIT,
    (SELECT 
            SUM((SELECT 
                        amount
                    FROM
                        sales_main_deduction AS INTERNAL
                    WHERE
                        INTERNAL.instance = '4%' AND INTERNAL.idsales_main = SMinternal.idsales_main))
        FROM
            sales_main AS SMinternal
        WHERE
            SMinternal.sales_date = SM.sales_date AND SMinternal.vehicle_name=SM.vehicle_name) AS '4%'
            ,
    (SELECT 
            SUM((SELECT 
                        amount
                    FROM
                        sales_main_deduction AS INTERNAL
                    WHERE
                        INTERNAL.instance = '6%' AND INTERNAL.idsales_main = SMinternal.idsales_main))
        FROM
            sales_main AS SMinternal
        WHERE
            SMinternal.sales_date = SM.sales_date AND SMinternal.vehicle_name=SM.vehicle_name) AS '6%',
    (SELECT 
            SUM((SELECT 
                        amount
                    FROM
                        sales_main_deduction AS INTERNAL
                    WHERE
                        INTERNAL.instance = '10%' AND INTERNAL.idsales_main = SMinternal.idsales_main))
        FROM
            sales_main AS SMinternal
        WHERE
            SMinternal.sales_date = SM.sales_date AND SMinternal.vehicle_name=SM.vehicle_name) AS '10%',
    (SELECT 
            SUM((SELECT 
                        amount
                    FROM
                        sales_main_deduction AS INTERNAL
                    WHERE
                        INTERNAL.instance = 'M/R' AND INTERNAL.idsales_main = SMinternal.idsales_main))
        FROM
            sales_main AS SMinternal
        WHERE
            SMinternal.sales_date = SM.sales_date AND SMinternal.vehicle_name=SM.vehicle_name) AS 'M/R',
    (SELECT 
            SUM((SELECT 
                        amount
                    FROM
                        sales_main_deduction AS INTERNAL
                    WHERE
                        INTERNAL.instance = 'S/R' AND INTERNAL.idsales_main = SMinternal.idsales_main))
        FROM
            sales_main AS SMinternal
        WHERE
            SMinternal.sales_date = SM.sales_date AND SMinternal.vehicle_name=SM.vehicle_name) AS 'S/R'
FROM
    sales_main AS SM
WHERE
    (SM.sales_date >= '2013-06-01' AND SM.sales_date <= '2013-06-05') AND SM.vehicle_name='Lorry1'
Run Code Online (Sandbox Code Playgroud)

这就是结果..

2013-06-01  59582.03  58336.59  32096.96  11141.02  15098.59  1245.44                
2013-06-03  132334.45  126461.84  33138.93  11046.63  82276.28  1774.46 557.02  3541.13  2013-06-04  72184.69  71882.93  27840.74  12410.16  31632.03   152.16    149.6     
2013-06-05  93478.20  86721.32  34461.47  24971.24  27288.6  934.48  3553.32  2269.08
Run Code Online (Sandbox Code Playgroud)

但是,如果此查询扩展到每月 31 天,则需要 10 分钟才能从 2000 行表中返回结果......请帮助......

小智 5

到底为什么会有这些内心的疑问?

全部转换(我只是举个例子)

SELECT DISTINCT
    SM.sales_date,
    (SELECT 
            SUM(gross_sale)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TGROSS,
    (SELECT 
            SUM(net_sale)
        FROM
            sales_main AS INTERNAL
        WHERE
            INTERNAL.sales_date = SM.sales_date AND INTERNAL.vehicle_name=SM.vehicle_name) AS TNET,
Run Code Online (Sandbox Code Playgroud)

到:

SELECT 
       sales_date,
       SUM(gross_sale) AS TGROSS,
       SUM(net_sale) AS TNET
FROM
            sales_main
        WHERE
            sales_date BETWEEN X AND Y 
         AND 
             vehicle_name=vehicle_name
GROUP BY YEAR(sales_date), MONTH(sales_date), DAY(sales_date)
Run Code Online (Sandbox Code Playgroud)

一旦你开始工作,我们就可以进一步优化它。

GROUP BY也可以只是GROUP BY sales_date如果sales_date是的DATE类型,DATE(sales_date)如果是DATETIME类型。
我使用该 group by 来WITH ROLLUP总结我在报告服务中经常使用的组...