返回
从表 A 和表 B 获取特定名称的交易记录:综合方法
mysql
2024-03-22 18:20:37
从表 A 和表 B 获取结果表:综合方法
引言
在数据分析领域,我们经常需要从不同来源提取信息,并将它们合并为一个综合结果。本篇博文将指导你如何从两个表中提取数据并创建所需的输出。我们将使用一个实际示例来演示过程,其中需要从表 A 和表 B 中获取名为“Clark”的人的交易记录。
问题陈述
我们有以下两个表:
表 A:
a_id | name | dept | a_date | amount |
---|---|---|---|---|
123 | Clark | Sales | 2024-01-01 | 5000 |
124 | Clark | Sales | 2024-01-02 | 6000 |
125 | John | Sales | 2024-01-03 | 3500 |
126 | John | Sales | 2024-01-04 | 5500 |
表 B:
b_id | name | dept | b_date | amount | status | type |
---|---|---|---|---|---|---|
2001 | Clark | Sales | 2024-02-05 | 1000 | Paid | Loan |
2002 | Clark | Sales | 2024-02-06 | 1000 | Unpaid | Loan |
2003 | Clark | Sales | 2024-02-08 | 5000 | Paid | Loan |
2004 | Clark | Sales | 2024-02-09 | 1000 | Unpaid | Adv |
2005 | John | Sales | 2024-02-11 | 1000 | Unpaid | Loan |
目标: 创建一个结果表,其中包含给定名称(例如“Clark”)的每笔交易记录,格式如下:
结果表:
Date | Amount |
---|---|
2024-01-01 | +5000 |
2024-01-02 | +6000 |
2024-02-05 | -1000 |
2024-02-08 | -5000 |
Total | +5000 |
解决方案
要解决此问题,我们将使用公共表表达式(CTE)来合并表 A 和表 B 中的数据。
WITH Transactions AS (
SELECT
name,
CASE WHEN t.amount > 0 THEN '+' || CAST(t.amount AS TEXT) ELSE CAST(t.amount AS TEXT) END AS amount,
a_date AS date
FROM TableA AS t
WHERE
name = 'Clark'
UNION
SELECT
name,
CASE WHEN t.amount > 0 THEN '+' || CAST(t.amount AS TEXT) ELSE CAST(t.amount AS TEXT) END AS amount,
b_date AS date
FROM TableB AS t
WHERE
name = 'Clark' AND status = 'Paid' AND type = 'Loan'
)
SELECT
date,
amount,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) OVER (ORDER BY date) AS total_amount
FROM Transactions
ORDER BY
date;
CTE 解释:
CTE Transactions
将表 A 和表 B 中满足特定条件的数据合并到一个表中。对于表 A,我们包括所有名为“Clark”的交易。对于表 B,我们只包括那些状态为“Paid”且类型为“Loan”的交易。
查询解释:
SELECT date, amount, SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) OVER (ORDER BY date) AS total_amount FROM Transactions
:此查询从Transactions
CTE 中提取date
、amount
和total_amount
字段。total_amount
字段使用窗口函数计算,按date
排序,对于每个日期计算累积总和。ORDER BY date
:结果按date
排序,生成所需的输出。
结论
使用 CTE 和窗口函数,我们能够有效地从两个表中提取数据并创建所需的输出。这种技术在数据分析中非常有用,因为它允许我们组合来自不同来源的信息,以获得更全面的结果。
常见问题解答
-
为什么我们在 CTE 中使用 UNION 运算符?
- UNION 运算符将表 A 和表 B 中满足特定条件的数据合并到一个表中。
-
为什么我们在 CASE 语句中使用 + 号?
-
- 号用于将贷方金额与借方金额区分开来。贷方金额带有 + 号,而借方金额没有。
-
-
为什么我们在 OVER 子句中使用 SUM() 函数?
- SUM() 函数计算每个日期的累积总和。
-
结果表中的 Total 行是什么?
- Total 行显示截至最后一个日期的总余额。
-
如何修改查询以提取不同名称的交易记录?
- 只需将 CTE 中的
WHERE name = 'Clark'
条件替换为所需的名称即可。
- 只需将 CTE 中的