【问题标题】:Sum of transactions between varying dates不同日期之间的交易总和
【发布时间】:2016-11-07 14:36:11
【问题描述】:

背景

我有一个包含交易的表格。有两种类型的事务:“正常条目”(type=N)和“修复”条目(type=F)。每笔交易都有一个客户 ID、一个日期、一个类型代码和一个欧元金额。一些示例数据如下:

| client_id |   date    | transaction_type | amount  |
|-----------|-----------|------------------|---------|
|       111 | 01jan2015 | N                |  1000.0 |
|       111 | 01jan2015 | F                |  -500.0 |
|       222 | 05mar2015 | N                |  2000.0 |
|       222 | 06mar2015 | F                |  -100.0 |
|       222 | 07mar2015 | F                |  -100.0 |
|       222 | 09mar2015 | N                |  1000.0 |
|       222 | 10mar2015 | N                |   400.0 |
|       222 | 15jun2015 | F                |  -200.0 |

修复条目是对登记处某人进行的正常交易的手动更正。它们可以在同一天或正常交易之后完成,但如果为同一客户输入新的正常交易,则该客户的所有连续修复都与新交易有关(直到输入另一个正常交易)。因此,实际上,所有修复都只是“修复”了该客户端的最新事务。

修正可以是正数或负数,正常交易只有正数。

期望的输出

我想要的是每个客户的一组“正常”交易,总金额由与该交易相关的所有修复修正。下面的示例数据:

| client_id |   date    | amount |
|-----------|-----------|--------|
|       111 | 01jan2015 |  500.0 |
|       222 | 05mar2015 | 1800.0 |
|       222 | 07mar2015 | 1000.0 |
|       222 | 08mar2015 |  200.0 |

所以这是一个类型为 N 的事务和所有连续的 F 事务直到下一个 N 事务的总和。

我目前所拥有的

如果所有修复都发生在与原始交易相同的日期(通常是这种情况),这很简单:

select client_id, date, sum(amount)
from transaction_table
group by client_id, date

但是,我在处理原始交易日期之后发生的修复时遇到了问题,因为我只需要选择在下一次正常交易之前发生的修复(这需要适用于每个正常交易)。

产品使用说明

我实际上使用的是 SAS 9.4,但是通过 SAS 的 proc sql 过程,我可以应用基本的 SQL,这就是我更习惯使用的方法。不过没什么特别的(所以游标、CTE 等都出来了)。一个不错的 SAS 答案也将被接受!

【问题讨论】:

  • 游标在 SAS SQL 中可用。
  • 您是否可以假设您提供的订单将会存在,或者是否也需要将其考虑到解决方案中?
  • 是的,可以假定行顺序是这样的。感谢光标的东西,我不知道。

标签: sql sas


【解决方案1】:

创建一个在每个 N 处设置的分组标志。 如果同一天有多次购买会怎样?

 Data want;
  Set have;
  By ID;
   Retain purchaseGroup;
  If transx = 'N' then purchaseGroup+1;
  If first.id then purchaseGroup=1;
 Run;

然后使用按 ID 和 PurchaseGroup 分组的 SQL 步骤进行汇总。

【讨论】:

  • 您对同一天的多次购买提出了很好的观点。看起来这是可能的,但就这些数据的实际使用而言,是否将同一天的 N 次交易加在一起并不会产生影响(也就是说,我可以同时接受这两种选择)。
  • 你的ID是什么?它只是 client_ID 还是您的意思是 client_ID 和日期?
  • 这会将每个购买分组到自己的组中。
  • 知道了,这适用于 client_ID 作为 ID。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多