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'からの回答に基づくフィドル
この回答は正しくありませんでしたが、承認された回答は削除できません。
代わりに、この質問に対するこの other answer を参照して解決策を見つけてください。
このリクエストはかなり古いですが、受け入れられた答えが間違っているため、正しいものを追加したいと思ったので、将来の読者が混乱することはありません。
キャンペンには着陸船と改宗者がいます。すべてのテーブルを結合するだけの場合、2つのランディングと3つのコンバージョン2 x 3 = 6の結果行を持つキャンペーンが得られます。合計またはカウントすると、間違った結果が返されます(例では、着陸船の数は3倍になり、コンバージョン合計は2倍になります)。
これには主に2つの方法があります。
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
を使用してゼロを取得できます。
正しい計算を行うには、関節は次のようにする必要があります。
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