如何在MySQL中对不同的选择进行求和

如何在MySQL中对不同的选择进行求和,mysql,Mysql,该查询工作并返回正确汇总的不同金额。然后我尝试在一个更大的查询中获取这些信息: SELECT SUM(`PR Requests`), CAR, Request_State FROM ( SELECT DISTINCT Po_Line_Amount AS `PR Requests`, Project_Code AS CAR, Request_State FROM

该查询工作并返回正确汇总的不同金额。然后我尝试在一个更大的查询中获取这些信息:

SELECT
    SUM(`PR Requests`),
    CAR,
    Request_State
FROM
    (
        SELECT DISTINCT
            Po_Line_Amount AS `PR Requests`,
            Project_Code AS CAR,
            Request_State
        FROM
            Table1
        WHERE NOT (
            Request_State LIKE '%canceled%'
            OR Request_State LIKE '%pulled_back%'
        )
    ) t

这会运行,但它为PR提供NULL,我希望得到PR请求的总和。我的别名错了吗?

如果
PR
为空,并且由于您正在进行左连接,这只能意味着在
b.CAR=a.7ca的条件下没有结果。汽车

找到了它;一时兴起,我试着在selectdistinct代码的t后面添加一个groupby

SELECT ID, Title, `Start Date`, `7ca. CAR` AS CAR, b.PR, c.Capex, c.PO_Committed AS `PO Committed`, c.PO_Invoiced AS `PO Invoiced`
FROM Table3 a
LEFT JOIN (
    SELECT
    SUM(`PR Requests`) AS PR,
    CAR,
    Request_State
FROM
    (
        SELECT DISTINCT
            Po_Line_Amount AS `PR Requests`,
            Project_Code AS CAR,
            Request_State
        FROM
            Table1
        WHERE NOT (
            Request_State LIKE '%canceled%'
            OR Request_State LIKE '%pulled_back%'
        )
    ) t
) b ON b.CAR = a.`7ca. CAR`
LEFT JOIN (
    SELECT Car_Number, SUM(Capex) AS Capex, SUM(PO_Committed) AS PO_Committed, SUM(PO_Invoiced) AS PO_Invoiced
    FROM Table2
    GROUP BY Car_Number
) c ON c.Car_Number = a.`7ca. CAR`
WHERE `Snapshot` = (SELECT MAX(`Snapshot`) FROM RandD_Playbook)
AND NOT ISNULL(PO_Committed)
GROUP BY
    ID, Title

这清除了空值。不确定为什么需要这样做,但它在所有情况下都能工作,所以这对我来说很好。

每次执行一个子查询,看看是否得到预期的结果。另外,给我们一些示例数据。谢谢。所有这些查询最初都是建立在它们自己的基础上的,并且都是有效的。如果我取出SELECT DISTINCT部分,只使用不带该部分的查询,它工作正常并返回值。问题是Table1数据中存在重复(实际上是三倍),而我并不拥有传入该表的数据;它不是一个简单的集合,因为它至少需要3个表,除了当我自己拉它与车上已知的良好匹配时它不是空的。自己拉记录不同于用多个表连接它,特别是当你处理
左连接
分组方式
s时。我猜您的
b
c
表不满足产生
NULL
的条件之一。您的
分组依据
可能返回空记录,而不是找到的
PR
记录。例如,如果您删除了两个
左连接
s并使它们成为一个
连接
,您将无法获得预期的整个数据集,但我打赌每个记录都会有一个
PR
值;你可以在上面看到我的答案。
SELECT ID, Title, `Start Date`, `7ca. CAR` AS CAR, b.PR, c.Capex, c.PO_Committed AS `PO Committed`, c.PO_Invoiced AS `PO Invoiced`
FROM Table3 a
LEFT JOIN (
    SELECT
    SUM(`PR Requests`) AS PR,
    CAR,
    Request_State
FROM
    (
        SELECT DISTINCT
            Po_Line_Amount AS `PR Requests`,
            Project_Code AS CAR,
            Request_State
        FROM
            Table1
        WHERE NOT (
            Request_State LIKE '%canceled%'
            OR Request_State LIKE '%pulled_back%'
        )
    ) t
  GROUP BY CAR
) b ON b.CAR = a.`7ca. CAR`
LEFT JOIN (
    SELECT Car_Number, SUM(Capex) AS Capex, SUM(PO_Committed) AS PO_Committed, SUM(PO_Invoiced) AS PO_Invoiced
    FROM Table2
    GROUP BY Car_Number
) c ON c.Car_Number = a.`7ca. CAR`
WHERE `Snapshot` = (SELECT MAX(`Snapshot`) FROM RandD_Playbook)
AND NOT ISNULL(PO_Committed)
GROUP BY
    ID, Title