首页 > 解决方案 > 请如何解决“无效使用组功能”

问题描述

我尝试在 SUM() 函数中使用嵌套的 CASE WHEN 语法,但从 3 天开始就没有任何效果

当我检索所有总和和嵌套条件时,代码运行良好

我解释:

因此,我尝试做的是在实际月份中为每个客户获得所有经济损失,并将所有这些金额相加

SELECT 
    SUM(pertes) AS pertes_reelles
FROM
    (SELECT 
        c.ID_clt,
            SUM(CASE
                WHEN
                    ((co.Qac_cont - SUM(CASE
                        WHEN Quantite_cmd IS NULL THEN 0
                        ELSE Quantite_cmd
                    END)) * - 1) < 0
                THEN
                    ((co.Qac_cont - SUM(CASE
                        WHEN Quantite_cmd IS NULL THEN 0
                        ELSE Quantite_cmd
                    END)) * - 1)
                ELSE 0
            END) * co.Prix_TTC AS pertes
    FROM
        clients c
    LEFT JOIN contrat co ON co.clt_ID = c.ID_clt
    LEFT JOIN commande cmd ON cmd.clt_ID = c.ID_clt
        AND MONTH(DATE(cmd.date_livr_cmd)) = MONTH(DATE('2019-08-30 09:23:23'))
    WHERE
        c.Etat_clt <> 'D'
    GROUP BY c.ID_clt) AS liste

标签: mysql

解决方案


就像@BobJarvis 说的那样,问题出在嵌套的 SUM 上,所以我分解了嵌套处理,它可以工作,谢谢!新要求:

SELECT SUM(CASE
                WHEN
                    perte < 0
                THEN
                    perte * - 1
                ELSE 0
            END) AS pertes_reelles
FROM
    (SELECT 
        c.ID_clt, co.Prix_TTC, ((co.Qac_cont - SUM(CASE
                        WHEN Quantite_cmd IS NULL THEN 0
                        ELSE Quantite_cmd
                    END)) * - 1) as ecart, co.Prix_TTC * ((co.Qac_cont - SUM(CASE
                        WHEN Quantite_cmd IS NULL THEN 0
                        ELSE Quantite_cmd
                    END)) * - 1) as perte
    FROM
        clients c
    LEFT JOIN contrat co ON co.clt_ID = c.ID_clt
    LEFT JOIN commande cmd ON cmd.clt_ID = c.ID_clt
        AND MONTH(DATE(cmd.date_livr_cmd)) = MONTH(DATE('".$today."'))
    WHERE
        c.Etat_clt <> 'D'
    GROUP BY c.ID_clt) AS liste

推荐阅读