web-dev-qa-db-ja.com

集計のために複数のテーブルを結合する

Sum関数とCount関数を使用して、集計用の複数のテーブルを結合するにはどうすればよいですか?

私が試しているクエリは次のとおりです:

Select
  campaigns.id,
  campaigns.name,
  Count(landers.campaign_id) As landers_count,
  Sum(conversions.revenue) As total_revenue
From
  campaigns Left Join
  conversions
    On campaigns.id = conversions.campaign_id Left Join
  landers
    On campaigns.id = landers.campaign_id
Group By
  campaigns.id

私は外部結合も試しましたが、運が悪く、不正確な結果が出ています。

私の例のテーブルは次のとおりです:

キャンペーン表:

| id | name           |
+----+----------------+
| 1  | Facebook Ads   |
| 2  | Bing Ads       |
| 3  | Direct Mailing |
| 4  | Solo Ads       |

Landersテーブル:

| id | name        | campaign_id |
+----+-------------+-------------+
| 1  | Lander 1    | 1           |
| 2  | Lander Two  | 2           |
| 3  | Lander 3    | 4           |
| 4  | Lander Four | 1           |

変換表:

| id | revenue | campaign_id | lander_id |
+----+---------+-------------+-----------+
| 1  | 25.00   | 1           | 1         |
| 2  | 12.00   | 1           | 4         |
| 3  | 19.00   | 4           | 3         |

私が期待している結果は以下のようになります:

| campaigns.id | campaigns.name | landers_count | total_revenue |
+--------------+----------------+---------------+---------------+
| 1            | Facebook Ads   | 2             | 37.00         |
| 2            | Bing Ads       | 1             | 00.00         |
| 3            | Direct Mailing | 0             | 00.00         |
| 4            | Solo Ads       | 1             | 19.00         |

@ 'Willem Renzema'からの回答に基づくフィドル

フィドル

4
Jani

この回答は正しくありませんでしたが、承認された回答は削除できません。

代わりに、この質問に対するこの other answer を参照して解決策を見つけてください。

0
Willem Renzema

このリクエストはかなり古いですが、受け入れられた答えが間違っているため、正しいものを追加したいと思ったので、将来の読者が混乱することはありません。

キャンペンには着陸船と改宗者がいます。すべてのテーブルを結合するだけの場合、2つのランディングと3つのコンバージョン2 x 3 = 6の結果行を持つキャンペーンが得られます。合計またはカウントすると、間違った結果が返されます(例では、着陸船の数は3倍になり、コンバージョン合計は2倍になります)。

これには主に2つの方法があります。

Select句のサブクエリで集計します。

select
  id, name,
  (select count(*) from landers l where l.campaign_id = ca.id) as landers_count,
  (select sum(revenue) from conversions co where co.campaign_id = ca.id) as total_revenue
from campaigns ca
order by id;

参加する前に集計します。

select ca.id, ca.name, l.landers_count, co.total_revenue
from campaigns ca
left join
(
  select campaign_id, count(*) as landers_count
  from landers
  group by campaign_id
) l on l.campaign_id = ca.id
left join
(
  select campaign_id, sum(revenue) as total_revenue
  from conversions
  group by campaign_id
) co on co.campaign_id = ca.id
order by ca.id;

結果でnullの代わりにCOALESCEを使用してゼロを取得できます。

4

正しい計算を行うには、関節は次のようにする必要があります。

Select   campaigns.id,   campaigns.name,   (SELECT Count(landers.campaign_id)FROM landers WHERE campaigns.id = landers.campaign_id) As landers_count,   (SELECT Sum(conversions.revenue) FROM conversions WHERE campaigns.id = conversions.campaign_id ) As total_revenue From   campaigns Left Join   conversions
    On campaigns.id = conversions.campaign_id Left Join   landers
    On campaigns.id = landers.campaign_id Group By   campaigns.id
0
Yahia Baiba