2015-10-15 74 views
2

显示一列我有两个表子查询到一个表作为两个单独的列

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     

这是我的表,有什么想实现是让账簿余额特定月份。这里不是试图将数据插入到表中。

使用上面两个表我只需要查询和出把结果作为

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作为借方和铬作为学分。这是我想要实现的。

我到现在为止所尝试的是加入交易表与分类帐!但是,通过查询这两个表,我无法获得所需的输出结果。

这是我曾经尝试过,

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”分开?

+0

您可以在此更改示例输出以显示实际存在于“交易”表中的行吗?您发布的示例没有'ledger_id = 1'的行,尽管我认为我理解了这个要求,但是看到_exactly_是给定示例输入应该生成的输出很有帮助。 –

+0

我想澄清的另一件事 - 这看起来像只将Dr,Cr分隔为单独的列,但在一列中列出了相关的“数量”。这是正确的,还是有意为每个分类账编号创建一个聚合“SUM()”? –

+0

@MichaelBerkowski,是的你是对的,我只想把Dr,Cr分成不同的栏目,并在栏目中填入金额。 – shiva86

回答

1

您可以使用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

+0

完美的答案,取得了理想的结果,_非常感谢你。 – shiva86

0

尝试这种情况:

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

此代码创建的IF语句,确定[TRANS_TYPE]字段是否是“CR”或'博士和在TRANS_TYPE(“CR”或“博士返回值')如果条件满足或者在条件不满足时返回空白(“”)。

+0

请解释这是做什么或为什么它的作品。 –

相关问题