UNION ALL 后的 GROUP BY 不对结果进行分组

GROUP BY after UNION ALL doesn't group the result

我在这里阅读了一些关于 SO 的帖子,但找不到解决我的问题的方法。

我想将 3 个结果集合并为一个,但 GROUP BY 似乎不允许我对它们进行分组。相反,列会被覆盖。

这是我的 MYSQL 查询:

SELECT spent.cid AS cid, spent.clientname AS clientname, spent.sumyearone AS sumyearone, spent.sumyeartwo AS sumyeartwo, spent.sumyearthree AS sumyearthree
FROM (
    SELECT yearone.cid AS cid, yearone.clientname AS clientname, yearone.sum AS sumyearone, 0 AS sumyeartwo, 0 AS sumyearthree
        FROM (
            ...
        ) AS yearone
    GROUP BY yearone.cid
    UNION ALL
    SELECT yeartwo.cid AS cid, yeartwo.clientname AS clientname, 0 AS sumyearone, yeartwo.sum AS sumyeartwo, 0 AS sumyearthree
       FROM (
           ...
       ) AS yeartwo
    GROUP BY yeartwo.cid
    UNION ALL
    SELECT yearthree.cid AS cid, yearthree.clientname AS clientname, 0 AS sumyearone, 0 AS sumyeartwo, yearthree.sum AS sumyearthree
        FROM (
            ...
        ) AS yearthree
    GROUP BY yearthree.cid
) AS spent
GROUP BY spent.cid
ORDER BY spent.cid DESC

如果我 运行 使用 GROUP BY spent.cid 的查询,我会得到以下结果

cid    clientname    sumyearone    sumyeartwo    sumyearthree
50     Jon Doe       1083          0             0

但是如果我 运行 它没有 GROUP BY spent.cid 我得到三个正确的 return 值:

cid    clientname    sumyearone    sumyeartwo    sumyearthree
50     Jon Doe       1083          0             0
50     Jon Doe       0             1602          0
50     Jon Doe       0             0             1367

不过我想要的是:

cid    clientname    sumyearone    sumyeartwo    sumyearthree
50     Jon Doe       1083          1602          1367

PS:如果我在字段声明中使用 null 而不是 0(即 null AS sumyeartwo

,我会得到类似的结果

谢谢

您可以使用 SUMGROUP BY 来获取这些数字,例如:

SELECT spent.cid AS cid, spent.clientname AS clientname, SUM(spent.sumyearone) AS sumyearone, SUM(spent.sumyeartwo) AS sumyeartwo, SUM(spent.sumyearthree) AS sumyearthree
FROM (
    SELECT yearone.cid AS cid, yearone.clientname AS clientname, yearone.sum AS sumyearone, 0 AS sumyeartwo, 0 AS sumyearthree
        FROM (
            ...
        ) AS yearone
    GROUP BY yearone.cid
    UNION ALL
    SELECT yeartwo.cid AS cid, yeartwo.clientname AS clientname, 0 AS sumyearone, yeartwo.sum AS sumyeartwo, 0 AS sumyearthree
       FROM (
           ...
       ) AS yeartwo
    GROUP BY yeartwo.cid
    UNION ALL
    SELECT yearthree.cid AS cid, yearthree.clientname AS clientname, 0 AS sumyearone, 0 AS sumyeartwo, yearthree.sum AS sumyearthree
        FROM (
            ...
        ) AS yearthree
    GROUP BY yearthree.cid
) AS spent
GROUP BY spent.cid, spent.clientname
ORDER BY spent.cid DESC