返回

JOIN、SUM() 和 GROUP BY:连接、分组和求和数据的深入指南

mysql

使用 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_earnuser_activity_rewardsuser_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. 如何避免连接列数据类型不匹配的错误?

  • 确保连接列在两张表中具有相同的数据类型