返回

从表 A 和表 B 获取特定名称的交易记录:综合方法

mysql

从表 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 中提取 dateamounttotal_amount 字段。total_amount 字段使用窗口函数计算,按 date 排序,对于每个日期计算累积总和。
  • ORDER BY date:结果按 date 排序,生成所需的输出。

结论

使用 CTE 和窗口函数,我们能够有效地从两个表中提取数据并创建所需的输出。这种技术在数据分析中非常有用,因为它允许我们组合来自不同来源的信息,以获得更全面的结果。

常见问题解答

  1. 为什么我们在 CTE 中使用 UNION 运算符?

    • UNION 运算符将表 A 和表 B 中满足特定条件的数据合并到一个表中。
  2. 为什么我们在 CASE 语句中使用 + 号?

      • 号用于将贷方金额与借方金额区分开来。贷方金额带有 + 号,而借方金额没有。
  3. 为什么我们在 OVER 子句中使用 SUM() 函数?

    • SUM() 函数计算每个日期的累积总和。
  4. 结果表中的 Total 行是什么?

    • Total 行显示截至最后一个日期的总余额。
  5. 如何修改查询以提取不同名称的交易记录?

    • 只需将 CTE 中的 WHERE name = 'Clark' 条件替换为所需的名称即可。