MySQL - 基于多列无效的百分比增加
MySQL - Percentage increase based on multiple columns not working
我正在尝试编写一个查询来计算基于 A1、A2、A3 三列的百分比增加。 objective是确定百分比increase/decrease。请参阅简化的 Excel 计算
此处 A1、A2、A3 是我的 table PCLS
中的三列,我正在使用它们更新 table PCNT
。计算很简单,我首先计算 PCNT.A
出现在 A1、A2、A3 列中的次数(在本例中为 4、52、3),然后应用因子 10000 得到列中的初始值S10K。 CV 列从另一个来源获取当前值,现在我的 objective 是确定 CV 相对于 S10K 的增减百分比。在 Excel 示例中,它将是 (630135.6-590000)/(590000)*100 对应于 6.80% 的增长。在 Excel 中看起来很简单,但我无法在 MySQL 中正确计算它。我尝试了以下
UPDATE PCNT SET `R%`= (
(
(
(
(SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT SUM(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT SUM(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
)
- (
(
(SELECT count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
)*10000
)
)
)
/
(
(
(SELECT count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
) * 10000
)
)*100;
然而,这似乎只有当 PCNT.A
出现在所有三列 A1、A2、A3 中时才有效。如果它不存在于任何一列中,它的计算结果为 NULL。
我尝试了以下替代方法,但问题并没有消失
UPDATE PCNT
set `R%` = ((((((SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`) - ((SELECT
count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)*10000))/((SELECT count(`CV`) from
PCLS WHERE `A1`=PCNT.`A`)*10000))*100))) + ((((((SELECT SUM(`CV`) from PCLS
WHERE `A2`=PCNT.`A`) - ((SELECT count(`CV`) from PCLS WHERE
`A2`=PCNT.`A`)*10000))/((SELECT count(`CV`) from PCLS WHERE
`A2`=PCNT.`A`)*10000))*100))) + ((((((SELECT SUM(`CV`) from PCLS WHERE
`A3`=PCNT.`A`) - ((SELECT count(`CV`) from PCLS WHERE
`A3`=PCNT.`A`)*10000))/((SELECT count(`CV`) from PCLS WHERE
`A3`=PCNT.`A`)*10000))*100)));
如果我使用下面的查询,将搜索限制在 A1 列,似乎一切正常。此查询的计算结果为 16.34%,与 Excel 屏幕截图中的相似。
UPDATE PCNT
set `R%` = (((SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`) - ((SELECT
count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)*10000))/((SELECT count(`CV`) from
PCLS WHERE `A1`=PCNT.`A`)*10000))*100;
此时,我将 A2 和 A3 中不存在的任何 PCNT 值都包括在内。A
A2 的计算结果为 NULL。我想要的只是对 return (630135.6-590000)/(590000)*100 = 6.80% 的查询,但我很难让它工作。我感觉是加法操作导致的问题。
是否有正确的或替代的方法来执行此操作。我尝试进行多项更改,但没有成功。
SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`
SELECT COUNT(`CV`) from PCLS WHERE `A1`=PCNT.`A`
以上两个查询,如果 运行 独立似乎工作正常,当我使用加法运算符时问题就开始了。
The moment, I include A2 and A3 any values of PCNT.A that are not present in A1, A2 evaluate to NULL. [...] I feel that the addition operation causes the problem.
其中一个成员是 NULL
returns NULL
的加法(其他算术运算也是如此)。您需要将子查询用 COALESCE()
换成 returns 0
。
最重要的是,我确实怀疑您的查询可以重写以在聚合子查询上用 LEFT JOIN
s 替换多个内联查询,例如:
UPDATE pcnt pn
LEFT JOIN (SELECT a1, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a1) pa1 ON pa1.a1 = pn.a
LEFT JOIN (SELECT a2, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a2) pa2 ON pa2.a2 = pn.a
LEFT JOIN (SELECT a3, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a3) pa3 ON pa3.a3 = pn.a
SET pn.`R%` =
(
COALESCE(pa1.sumcv, 0) + COALESCE(pa2.sumcv, 0) + COALESCE(pa3.sumcv, 0)
- (COALESCE(pa1.cntcv, 0) + COALESCE(pa2.cntcv, 0) + COALESCE(pa3.cntcv, 0)) * 10000
)
/ ((COALESCE(pa1.cntcv, 0) + COALESCE(pa2.cntcv, 0) + COALESCE(pa3.cntcv, 0)) * 10000)
* 100
我正在尝试编写一个查询来计算基于 A1、A2、A3 三列的百分比增加。 objective是确定百分比increase/decrease。请参阅简化的 Excel 计算
此处 A1、A2、A3 是我的 table PCLS
中的三列,我正在使用它们更新 table PCNT
。计算很简单,我首先计算 PCNT.A
出现在 A1、A2、A3 列中的次数(在本例中为 4、52、3),然后应用因子 10000 得到列中的初始值S10K。 CV 列从另一个来源获取当前值,现在我的 objective 是确定 CV 相对于 S10K 的增减百分比。在 Excel 示例中,它将是 (630135.6-590000)/(590000)*100 对应于 6.80% 的增长。在 Excel 中看起来很简单,但我无法在 MySQL 中正确计算它。我尝试了以下
UPDATE PCNT SET `R%`= (
(
(
(
(SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT SUM(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT SUM(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
)
- (
(
(SELECT count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
)*10000
)
)
)
/
(
(
(SELECT count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A2`=PCNT.`A`)
+ (SELECT count(`CV`) from PCLS WHERE `A3`=PCNT.`A`)
) * 10000
)
)*100;
然而,这似乎只有当 PCNT.A
出现在所有三列 A1、A2、A3 中时才有效。如果它不存在于任何一列中,它的计算结果为 NULL。
我尝试了以下替代方法,但问题并没有消失
UPDATE PCNT
set `R%` = ((((((SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`) - ((SELECT
count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)*10000))/((SELECT count(`CV`) from
PCLS WHERE `A1`=PCNT.`A`)*10000))*100))) + ((((((SELECT SUM(`CV`) from PCLS
WHERE `A2`=PCNT.`A`) - ((SELECT count(`CV`) from PCLS WHERE
`A2`=PCNT.`A`)*10000))/((SELECT count(`CV`) from PCLS WHERE
`A2`=PCNT.`A`)*10000))*100))) + ((((((SELECT SUM(`CV`) from PCLS WHERE
`A3`=PCNT.`A`) - ((SELECT count(`CV`) from PCLS WHERE
`A3`=PCNT.`A`)*10000))/((SELECT count(`CV`) from PCLS WHERE
`A3`=PCNT.`A`)*10000))*100)));
如果我使用下面的查询,将搜索限制在 A1 列,似乎一切正常。此查询的计算结果为 16.34%,与 Excel 屏幕截图中的相似。
UPDATE PCNT
set `R%` = (((SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`) - ((SELECT
count(`CV`) from PCLS WHERE `A1`=PCNT.`A`)*10000))/((SELECT count(`CV`) from
PCLS WHERE `A1`=PCNT.`A`)*10000))*100;
此时,我将 A2 和 A3 中不存在的任何 PCNT 值都包括在内。A
A2 的计算结果为 NULL。我想要的只是对 return (630135.6-590000)/(590000)*100 = 6.80% 的查询,但我很难让它工作。我感觉是加法操作导致的问题。
是否有正确的或替代的方法来执行此操作。我尝试进行多项更改,但没有成功。
SELECT SUM(`CV`) from PCLS WHERE `A1`=PCNT.`A`
SELECT COUNT(`CV`) from PCLS WHERE `A1`=PCNT.`A`
以上两个查询,如果 运行 独立似乎工作正常,当我使用加法运算符时问题就开始了。
The moment, I include A2 and A3 any values of PCNT.A that are not present in A1, A2 evaluate to NULL. [...] I feel that the addition operation causes the problem.
其中一个成员是 NULL
returns NULL
的加法(其他算术运算也是如此)。您需要将子查询用 COALESCE()
换成 returns 0
。
最重要的是,我确实怀疑您的查询可以重写以在聚合子查询上用 LEFT JOIN
s 替换多个内联查询,例如:
UPDATE pcnt pn
LEFT JOIN (SELECT a1, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a1) pa1 ON pa1.a1 = pn.a
LEFT JOIN (SELECT a2, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a2) pa2 ON pa2.a2 = pn.a
LEFT JOIN (SELECT a3, SUM(cv) sumcv, COUNT(cv) cntcv FROM pcls GROUP BY a3) pa3 ON pa3.a3 = pn.a
SET pn.`R%` =
(
COALESCE(pa1.sumcv, 0) + COALESCE(pa2.sumcv, 0) + COALESCE(pa3.sumcv, 0)
- (COALESCE(pa1.cntcv, 0) + COALESCE(pa2.cntcv, 0) + COALESCE(pa3.cntcv, 0)) * 10000
)
/ ((COALESCE(pa1.cntcv, 0) + COALESCE(pa2.cntcv, 0) + COALESCE(pa3.cntcv, 0)) * 10000)
* 100