0

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

询问:

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

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

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

我在做不正确的加入吗?还是我按错误的值分组?

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

(让我知道是否需要整个表格结构 - 我跳过它以避免使问题过长。我希望包括所有相关信息。)

4

3 回答 3

2

可能有多个事务具有相同的TXN_ID. 在这种情况下,加入将在每个匹配的事务中列出一次相同的许可证。

于 2012-04-10T21:55:40.217 回答
0

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

于 2012-04-10T22:00:44.647 回答
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
于 2012-04-10T22:15:24.123 回答