mysql - 请如何解决“无效使用组功能”
问题描述
我尝试在 SUM() 函数中使用嵌套的 CASE WHEN 语法,但从 3 天开始就没有任何效果
当我检索所有总和和嵌套条件时,代码运行良好
我解释:
- Table contrat:每个客户端都有一个合约,其中这两个值:Prix_TTC(商品价格),Qac_cont(商品客户端每月必须消费的数量)
- 表命令:每个客户订购商品的数量(Quantite_cmd)
因此,我尝试做的是在实际月份中为每个客户获得所有经济损失,并将所有这些金额相加
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
解决方案
就像@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
推荐阅读
- angular - Ionic 4 ion-tabs 导航问题:按下后退按钮时,它转到上一个选项卡而不是上一页
- python - 如何检查蛇游戏中的蛇是否穿过食物?
- amazon-web-services - DynamoDB 多个过滤条件,给出错误 - buildTree 错误:未设置参数:ConditionBuilder
- mysql - 计算累计输赢百分比
- c# - jQuery dataTables:基于字符串的过滤器
- c++ - 如何创建一个删除 C 字符串中所有选定字符的函数?
- javascript - 如果原始表单对于屏幕阅读器来说过于复杂,是否提供备用表单以符合 WCAG 合规性?
- c# - 使用 dotcore api 在单页应用程序上联合注销
- angular - 下拉更改 - 数据显示 [object object]
- android - 构建发布 APK 时的 Android Gradle 插件警告