将 Table 中的一列显示为两个单独的列的子查询

Subquery to display one column in a Table as two separate columns

我有两个table

Ledgers Table
==============
ledger_id  ledger_name  open_bal  close_bal  dr_bal   cr_bal
---------  ---------   ---------  ---------   ------   ------  
1          Bank A/C        0       5000       5000      0              
2          Capital A/C     0      -50000      0         50000          
3          Cash A/C        0       30700      53500     22800      


Transactions Table 
==============
trans_id  trans_date  ledger_id  ledger_name   amount   trans_type 
---------  ---------  ---------  ---------    ---------  ---------  
1         2004-01-01   3          Cash A/C      50000  Dr                   
2         2004-01-01   2          Cap A/C       50000  Cr                    
3         2004-01-02   9          Purchase A/C  10000  Dr                   

这些是我的 table,我想要实现的是获取特定月份的分类帐余额。这里不是试图将数据插入 table。

使用上面两个table我只需要查询并输出结果为

Desired Output
==============      

ledger_id   ledger_name  amount trans_type As Debit   trans_type as Credit
---------   ---------    ------  ---------            --------- 
3           Cash A/C     50000        Dr                Null
2           Capital A/C  50000      Null                  Cr

所以这里的trans_type字段分别显示DR为Debits和Cr为Credits。这就是我想要实现的。

到目前为止,我一直在尝试使用分类账加入交易 table!但是我无法通过查询这两个 tables 获得所需的输出。

这是我试过的,

SELECT tr.trans_date, tr.amount, tr.ledger_id, l.ledger_name, tr.trans_type
FROM tbl_transaction tr LEFT JOIN tbl_ledgers l 
ON l.ledger_id = tr.ledger_id WHERE trans_date BETWEEN '2004-01-01' AND '2004-01-31'; 

所以我基本上想知道我们怎样才能做到这一点? trans_type 列拆分为两个 "Dr" 分开和 "Cr" 分开?

试试这个:

SELECT IIf([trans_type]='dr',[trans_type],"") AS debit, IIf([trans_type]='cr',[trans_type],"") AS credit
FROM tr;

此代码创建一个 IF 语句,以确定 [trans_type] 字段是 'cr' 还是 'dr' 并且 returns 中的值是 trans_type ('cr' 或 'dr') 如果满足条件或 returns 一个空白 ("") 当条件不满足时。

您可以使用 CASE 检查 trans_type 的实际值并显示它,对每个别名 Debit, Credit 执行一次。对于多个值,这会变得笨拙,但由于您只有两个,所以这是一个简单的方法。

SELECT 
  tr.ledger_id,
  l.ledger_name,
  tr.amount,
  CASE WHEN tr.trans_type = 'Dr' THEN tr.trans_type ELSE NULL END AS Debit,
  CASE WHEN tr.trans_type = 'Cr' THEN tr.trans_type ELSE NULL END AS Credit
FROM
  tbl_transaction tr
  LEFT JOIN tbl_ledgers l ON l.ledger_id = tr.ledger_id
WHERE
 trans_date BETWEEN '2004-01-01' AND '2004-01-31'; 

这里有一个演示:http://sqlfiddle.com/#!9/f5623/2

请注意,这使用了 LEFT JOIN,导致在演示中返回 ledger_id = 9(与您的示例不同)。将其更改为 INNER JOIN 将更正该问题。 (http://sqlfiddle.com/#!9/f5623/3)