JOIN、SUM() 和 GROUP BY:连接、分组和求和数据的深入指南
2024-03-15 04:35:13
使用 JOIN、SUM() 和 GROUP BY 连接并分组求和数据
简介
在数据分析和处理中,连接来自不同表的数据并对它们进行聚合是常见的任务。SQL 提供了强大的工具,如 JOIN、SUM() 和 GROUP BY,使这些操作变得容易。本文将深入探讨如何使用这些工具有效地连接并分组求和数据。
JOIN 表
JOIN 语句用于基于公共列将两张或更多张表链接在一起。共有四种类型的 JOIN:INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。在本文中,我们将重点介绍 INNER JOIN。
INNER JOIN 匹配两张表中具有相同值的公共列中的行。它仅返回同时在两张表中都存在的匹配行。
分组和求和
GROUP BY 语句用于根据指定的列将结果集分组。它将具有相同组值的行组合在一起。
SUM() 函数用于计算指定列中值的总和。它可以与 GROUP BY 语句一起使用,以计算每个组中指定列的总和。
示例:连接和分组求和奖励数据
假设我们有两个表:user_refer_earn
和 user_activity_rewards
。user_refer_earn
表包含用户推荐信息,而 user_activity_rewards
表包含用户活动奖励信息。
我们要连接这两张表并计算每个推荐用户获得的总奖励,我们可以使用以下 SQL 查询:
SELECT ure.*,
COUNT(DISTINCT(ure.id)) as total_referrer,
SUM(CASE WHEN uar.txn_type=1 THEN uar.reward ELSE 0 END) as total_used_reward
FROM user_refer_earn ure
JOIN user_activity_rewards uar ON uar.user_id = ure.code_owner
WHERE ure.code_owner = 1
GROUP BY ure.code_owner
查询解释
JOIN user_activity_rewards uar ON uar.user_id = ure.code_owner
:此行将user_refer_earn
表与user_activity_rewards
表基于code_owner
列连接起来。WHERE ure.code_owner = 1
:此行过滤结果集,仅选择code_owner
值为 1 的行。COUNT(DISTINCT(ure.id)) as total_referrer
:此行计算每个code_owner
的推荐用户总数。SUM(CASE WHEN uar.txn_type=1 THEN uar.reward ELSE 0 END) as total_used_reward
:此行计算每个code_owner
的总奖励。它使用CASE
语句检查txn_type
列的值,如果值为 1,则将reward
列的值添加到总和中,否则添加到 0。
注意事项
- 确保连接列在两张表中具有相同的数据类型。
- 在使用
GROUP BY
语句时,必须在SELECT
语句中包含GROUP BY
列。 - 在使用
SUM()
函数时,必须在SELECT
语句中指定要求和的列。
结论
JOIN、SUM() 和 GROUP BY 是强大的 SQL 工具,可用于连接和分组来自不同表的数据,并对它们执行复杂的聚合。通过掌握这些工具,你可以轻松地提取有价值的见解和洞察力,以帮助你做出明智的决策。
常见问题解答
1. 什么是常见的 JOIN 类型?
- INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN
2. GROUP BY 语句的作用是什么?
- 根据指定的列对结果集进行分组
3. SUM() 函数有什么用途?
- 计算指定列中值的总和
4. 如何在 JOIN 和 GROUP BY 语句中使用 CASE?
- 根据条件计算不同值
5. 如何避免连接列数据类型不匹配的错误?
- 确保连接列在两张表中具有相同的数据类型