MySQL - 基于多列不起作用的百分比增加

问题描述 投票:0回答:1

我正在尝试编写一个查询,根据三列A1,A2,A3计算百分比增加。目标是确定增加/减少的百分比。请参阅简化的Excel计算

enter image description here

这里A1,A2,A3是我的表PCLS中的三列,我正在更新表PCNT。计算很简单,我首先计算PCNT.A在列A1,A2,A3(在这种情况下为4,52,3)中出现的次数,然后应用因子10000以获得列S10K中的初始值。列CV从另一个源获取当前值,现在我的目标是确定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,一切似乎都正常。此查询的评估值与Excel屏幕截图中的值相似,为16.34%。

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值,A1,A2中不存在,评估为NULL。我想要的只是返回的查询(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`

以上两个查询,如果单独运行似乎工作正常,问题在我使用加法运算符时开始。

mysql sql percentage
1个回答
1
投票

此刻,我包括A2和A3,在A1,A2中不存在的任何PCNT.A值评估为NULL。 [...]我觉得添加操作会导致问题。

其中一个成员是NULL的补充返回NULL(同样适用于其他算术运算)。您需要使用COALESCE()包装子查询,以返回0

最重要的是,我怀疑您的查询可以被重写,以便在聚合子查询中用LEFT JOINs替换多个内联查询,例如:

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
© www.soinside.com 2019 - 2024. All rights reserved.