【问题标题】:Query for a financial balance with a PROC SQL in SAS?在 SAS 中使用 PROC SQL 查询财务余额?
【发布时间】:2023-03-18 11:33:01
【问题描述】:

我有两张表,先叫它“事务”

transaction_id transaction_type amount
101 1 50.00
102 2 25.00
103 3 35.00
104 2 15.00
105 1 60.00

第二个称它为“transaction_types”

id description
1 Deposit
2 Retirement
3 Inner_transaction

“transaction_types”表中的“id”列,对应第一个表中的“transsaction_id”

假设初始余额为 100,000.00 美元。我应该写一个查询来获取历史账户余额。我应该展示的表格是这样的:

transaction_id initial_balance deposit withdrawal final_balance
101 100000 50.00 100050
102 100050 25.00 100025
103 100025 100025
... ... ... ... ...

我使用 PROC SQL 在 SAS 中编写此代码:

TITLE "Balance Historico de la Wallet Empresarial";
PROC SQL;
    SELECT transaction_id,
           100000 AS initial_balance FORMAT=DOLLAR32.2,
           "" AS deposit,
           "" AS withdrawal,
           "" AS final_balance
    FROM _LIB.TRANSACTIONS;
QUIT;

但我不知道如何填充其他列。

【问题讨论】:

  • 使用您实际使用的 ONE 数据库的标签编辑您的问题。它显然不是 MySQL。
  • 交易类型真的只有3种吗?为什么你需要一个单独的表呢?
  • 为什么要在 SQL 中而不是 DATA 步骤中执行此操作?

标签: sql sas proc-sql


【解决方案1】:

考虑条件聚合,您可以有条件地分配新列,然后按所需的分组进行聚合。使用calculated 子句完成所需的最终余额算术。

TITLE "Balance Historico de la Wallet Empresarial"; 

PROC SQL; 
   SELECT transaction_id
        , initial_balance FORMAT=DOLLAR32.2
        , SUM(deposit) AS deposit FORMAT=DOLLAR32.2
        , SUM(withdrawal) AS withdrawal FORMAT=DOLLAR32.2
        , initial_balance + 
          calculated deposit - 
          calculated withdrawal AS final_balance FORMAT=DOLLAR32.2
  FROM 
   (SELECT ts.transaction_id
         , 100000 AS initial_balance
         , CASE WHEN tt.description = 'Deposit' THEN ts.amount ELSE NULL END AS deposit
         , CASE WHEN tt.description = 'Withdrawal' THEN ts.amount ELSE NULL END AS withdrawal
         , CASE WHEN tt.description = 'Inner_balance' THEN ts.amount ELSE NULL END AS inner_balance
    FROM _LIB.TRANSACTIONS ts
    INNER JOIN _LIB.TRANSACTION_TYPES tt
       ON ts.transaction_type = tt.id
   ) sub
  GROUP BY transaction_id
         , initial_balance;
QUIT; 

或者,对于 SAS SQL 方言,使用 IFN 以获得略短的语法:

  ...
  , IFN(tt.description = 'Deposit', ts.amount, .) AS deposit
  , IFN(tt.description = 'Withdrawal', ts.amount, .) AS withdrawal
  , IFN(tt.description = 'Inner_balance', ts.amount, .) AS inner_balance
  ...

【讨论】:

  • 非常感谢 Parfait,但我还有一个问题:在这种情况下,“Group by”语句如何工作,因为如果我只按“transaction_id”字段分组,我会得到相同的结果.我不明白为什么?
  • Parfait,我无法根据final_balance更新initial_balance,你能帮帮我吗?
  • 运行此查询时会产生什么结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多