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マイナスであり、ライセンスよりも多くのトランザクションがあります。

私の現在のデータベースでは、トランザクションが払い戻されたため、4つのライセンスが削除されました。

私の試み:

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

最初のライセンスタイプには、最初のクエリよりも合計4つ多いことに注意してください。これから、トランザクションテーブルの余分な行をカウントアップしていると推測します。しかし、理由はわかりません。LEFT JOIN左側のテーブルのすべての行を取得して、licenses使用可能なものに接続すると思ったからですtransactions

さまざまな結合を読んでも、希望する結果を生成するためにそれらを理解することはできません。

間違った結合をしていますか?または、間違った値でグループ化しますか?

合計がゼロカウントであっても、すべてのライセンスタイプを一覧表示したいことに注意してください。

(テーブル構造全体が必要かどうかを教えてください。質問が長くなりすぎないようにスキップしました。関連するすべての情報が含まれていることを願っています。)

4

3 に答える 3

2

同じのトランザクションが複数ある可能性がありますTXN_ID。その場合、参加すると、一致するトランザクションごとに1回同じライセンスが一覧表示されます。

于 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 に答える