【问题标题】:How to merge 2 group by select statements如何通过选择语句合并 2 个组
【发布时间】:2020-07-21 03:19:00
【问题描述】:
我有 2 个表格,1 个用于免费用户,1 个用于付费用户,它们都在跟踪点击,我需要为每个附属链接显示谁是引荐来源(域),用户有时可能是免费用户并且有时可能是付费用户,因此我需要合并两个表中的两个统计信息。
这个查询不起作用:
SELECT ref,COUNT(ref) AS clicks
FROM click_analytics_free
WHERE link_id = '$link_id'
GROUP BY ref
UNION ALL
SELECT ref,COUNT(ref) AS clicks
FROM click_analytics_paid
WHERE link_id = '$link_id '
GROUP BY ref
【问题讨论】:
标签:
sql
merge
group-by
union
【解决方案1】:
你可以做聚合:
SELECT ref,
SUM(CASE WHEN flag = 'free' THEN 1 ELSE 0 END) AS free_click,
SUM(CASE WHEN flag = 'paid' THEN 1 ELSE 0 END) AS paid_click
FROM (SELECT ref, 'free' as flag
FROM click_analytics_free
WHERE link_id = '$link_id '
UNION ALL
SELECT ref, 'paid' as flag
FROM click_analytics_paid
WHERE link_id = '$link_id'
) t
GROUP BY ref;
【解决方案2】:
你可以做一个union all 然后再次聚合:
SELECT ref, SUM(free_clicks), SUM(paid_clicks),
SUM(free_clicks + paid_clicks)
FROM ((SELECT ref, COUNT(ref) AS free_clicks, 0 as paid_clicks
FROM click_analytics_free
WHERE link_id = ?
GROUP BY ref
) UNION ALL
(SELECT ref, 0, COUNT(ref) AS paid_clicks
FROM click_analytics_paid
WHERE link_id = ?
GROUP BY ref
)
) c
GROUP BY ref;
? 是一个参数占位符。您的代码应该使用参数而不是修改查询字符串。