为什么我在加入两个表的MYSQL查询中得到不正确的SUM?

时间:2012-04-10 21:53:08

标签: mysql

简单工作查询,列出每种许可证类型的许可证数量:

查询:

SELECT
  COUNT(licenses.licenseID) AS total
FROM
  licenses
GROUP BY
  licenses.licensetypeID

结果:

total
=====
389
 14
  2
  5
  3
  1
  1

现在我想总结许可证的利润。表transactions包含来自PayPal的所有交易。我使用mc_gross来总结。有时会退款,因此mc_gross为负数,交易数量多于许可证数。

在我当前的数据库中,由于交易已退款,因此删除了四个许可证。

我的尝试:

SELECT
  COUNT(licenses.licenseID) AS total,
  SUM( transactions.mc_gross ) AS gross
FROM
  licenses
  LEFT JOIN transactions ON licenses.txn_id = transactions.txn_id
GROUP BY
  licenses.licensetypeID

结果:

393     9020.00
 14     NULL
  2     NULL
  5     NULL
  3     100.00
  1     NULL
  1     NULL

请注意,第一个许可证类型现在总共比第一个查询多四个。从中我推断出它正在计算事务表中的额外行。但我不明白为什么,因为我认为LEFT JOIN会占用左表licenses的所有行并连接到可用的transactions

阅读不同的联接,我无法理解它们产生我想要的结果。

我是否进行了错误的加入?或者我按错误的值分组?

请注意,我确实要列出所有许可证类型 - 即使它们总计为零计数。

(如果需要整个表结构,请告诉我 - 我跳过它以避免问题太长。我希望包含所有相关信息。)

3 个答案:

答案 0 :(得分:2)

可能有多个具有相同TXN_ID的交易。在这种情况下,连接将为每个匹配的事务列出相同的许可证。

答案 1 :(得分:0)

如果退款在交易表中作为负数输入,则不应删除原始交易。两者都需要存在以使总余额为0.因为您看到的交易比您想象的多4个,并且您知道有4个退款,我会说原始交易和退款交易都在交易表中,因为他们应该。

答案 2 :(得分:0)

感谢我的评论,我设法创建了一个产生正确结果的查询:

SELECT
  COUNT( distinct licenses.licenseID ) AS total,
  SUM( temp.mc_gross / temp.quantity ) AS gross
FROM
  licenses
  LEFT JOIN
    ( SELECT txn_id, mc_gross, quantity
      FROM transactions
      WHERE valid = 'VERIFIED-PAID'
    ) AS temp ON licenses.txn_id = temp.txn_id
GROUP BY
  licenses.licensetypeID

正确的数据:

total   gross
===================
389     7780.000000
 14     NULL
  2     NULL
  5     NULL
  3     60.000000
  1     NULL
  1     NULL

更新 - 改进了查询:

SELECT
  COUNT( licenses.licenseID ) AS total,
  SUM( transactions.mc_gross / transactions.quantity ) AS gross
FROM
  licenses
  LEFT JOIN transactions ON licenses.txn_id = transactions.txn_id AND transactions.valid = 'VERIFIED-PAID'
GROUP BY
  licenses.licensetypeID