将 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)
我有两个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)