如何减少数据库中选择数据的时间负担

时间:2017-11-09 02:11:04

标签: mysql sql

我想知道在我的代码数据库中获取数据时是否还有其他方法可以减少时间负担:

SELECT cust.CUSTOMERNAME, cust.STDTERMS, (
        SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) 
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT(intYear,'-',StartDate) AND CONCAT(intYear,'-',EndDate) AND act.SALESTYPE LIKE theSalesType AND act.CUSTOMER = cust.CUSTOMERNAME
        ) AS Amount, intYear AS intYear,
        (
        SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) 
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT(intYear1,'-',StartDate) AND CONCAT(intYear1,'-',EndDate) AND act.SALESTYPE LIKE theSalesType  AND act.CUSTOMER = cust.CUSTOMERNAME
        ) AS Amount2, intYear1 AS intYear2,
        (
        SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) 
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT(intYear2,'-',StartDate) AND CONCAT(intYear2,'-',EndDate) AND act.SALESTYPE LIKE theSalesType  AND act.CUSTOMER = cust.CUSTOMERNAME
        ) AS Amount3, intYear2 AS intYear3,
        (
        SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) 
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT(intYear3,'-',StartDate) AND CONCAT(intYear3,'-',EndDate) AND act.SALESTYPE LIKE theSalesType  AND act.CUSTOMER = cust.CUSTOMERNAME
        ) AS Amount4, intYear3 AS intYear4,
        (
        SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) 
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT(intYear4,'-',StartDate) AND CONCAT(intYear4,'-',EndDate) AND act.SALESTYPE LIKE theSalesType  AND act.CUSTOMER = cust.CUSTOMERNAME
        ) AS Amount5, intYear4 AS intYear5

        FROM 000_customer cust WHERE cust.CUSTOMERNAME = thecustomer;

在此代码中,它将选择每个选定的5年的总金额 看起来像这样,只需忽略这些值。 enter image description here

任何人都可以建议让这段代码永久加载吗? 从数据库中获取数据时? 我尝试了内部连接,但从数据库获取数据时的结果是不正确的。我无法使用我在where子句中使用的变量:

from 000_customer cust where cust.customername = '%'

如果我使用内部联接表中的select查询中的当前customername值。我将得到一个错误,说明cust.customername是未知列。

SELECT IFNULL(SUM(IFNULL(act.TOTALAMOUNT, 0) - IFNULL(act.DISCOUNTAMNT, 0)),0) AS Amount
        FROM 100_actual_transaction act 
        WHERE act.ATDATE BETWEEN CONCAT('2017','-','01-01') AND CONCAT('2017','-','12-30') AND act.CUSTOMER = cust.customername

所以查询可以确定现在有什么cust.customername值。因为我实际上想要显示每5年中每位客户的总金额。不是总年数。就在每一年。就像上面的例子一样。

建议非常感谢。提前谢谢。

问题已解决:

更新代码:

SELECT c.CUSTOMERNAME, c.STDTERMS,
        SUM(CASE WHEN a.ATDATE BETWEEN CONCAT('2017', '-', '01-01') AND CONCAT('2017', '-', '12-30')
        THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
        ELSE 0
        END) AS Amount1,
        SUM(CASE WHEN a.ATDATE BETWEEN CONCAT('2016', '-', '01-01') AND CONCAT('2016', '-', '12-30')
        THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
        ELSE 0
        END) AS Amount2,
        SUM(CASE WHEN a.ATDATE BETWEEN CONCAT('2015', '-', '01-01') AND CONCAT('2015', '-', '12-30')
        THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
        ELSE 0
        END) AS Amount3,
        SUM(CASE WHEN a.ATDATE BETWEEN CONCAT('2014', '-', '01-01') AND CONCAT('2014', '-', '12-30')
        THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
        ELSE 0
        END) AS Amount4,
        SUM(CASE WHEN a.ATDATE BETWEEN CONCAT('2013', '-', '01-01') AND CONCAT('2013', '-', '12-30')
        THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
        ELSE 0
        END) AS Amount5
        FROM 000_customer c JOIN
        100_actual_transaction a
        ON a.CUSTOMER = c.CUSTOMERNAME AND 
        a.SALESTYPE LIKE '%'
        WHERE c.CUSTOMERNAME LIKE '%'
        GROUP BY c.CUSTOMERNAME, c.STDTERMS;

我只是放了一个值,所以它澄清了我的主要逻辑。谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

使用条件聚合。我不确定你的逻辑究竟是什么,但是这样的事情:

SELECT c.CUSTOMERNAME, c.STDTERMS,
       SUM(CASE WHEN a.ATDATE BETWEEN CONCAT(intYear, '-', StartDate) AND CONCAT(intYear, '-', EndDate)
                THEN COALESCE(a.TOTALAMOUNT, 0) - COALESCE(a.DISCOUNTAMNT, 0)
                ELSE 0
           END) as Amount
FROM 000_customer c JOIN
     100_actual_transaction a
     ON a.CUSTOMER = c.CUSTOMERNAME AND
        a.SALESTYPE LIKE theSalesType
WHERE c.CUSTOMERNAME = thecustomer
GROUP BY c.CUSTOMERNAME, c.STDTERMS;

我无法确定什么是列,什么是变量。我很确定这是你正在寻找的逻辑。您需要为输出中所需的每个计算列重复SUM(CASE)