【发布时间】:2012-04-10 21:53:08
【问题描述】:
简单的工作查询,列出每种许可证类型的许可证数量:
查询:
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。
阅读不同的连接,我无法理解它们以产生我想要的结果。
我是在做不正确的加入吗?还是我按错误的值分组?
请注意,我确实想列出所有许可证类型 - 即使它们的总数为零。
(如果需要整个表格结构,请告诉我 - 我跳过它以避免使问题过长。我希望包括所有相关信息。)
【问题讨论】:
-
尝试计数(distinct license.licenseid) 以避免重复计数
-
@Jason:这更正了我的计数。但现在我看到了另一个问题。总利润也是错误的。但这是由于@StilesCrisis 提到的,有时会出现重复的
txn_id,因为他们的付款一直在等待中。看来我需要过滤掉这些。
标签: mysql