简单工作查询,列出每种许可证类型的许可证数量:
查询:
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
。
阅读不同的联接,我无法理解它们产生我想要的结果。
我是否进行了错误的加入?或者我按错误的值分组?
请注意,我确实要列出所有许可证类型 - 即使它们总计为零计数。
(如果需要整个表结构,请告诉我 - 我跳过它以避免问题太长。我希望包含所有相关信息。)
答案 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