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

时间:2015-10-15 11:10:40

标签: mysql finance

我有两张桌子

protected function afterDelete()
{
    parent::afterDelete();
    Like::model()->deleteAll('post_id='.$this->id);

}

这些是我的表,我想要实现的是获得特定月份的分类账余额。这里我没有尝试将数据插入表中。

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

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                   

因此,此处的trans_type字段单独显示DR作为借记,Cr作为信用。这就是我想要实现的目标。

我到目前为止所尝试的是加入交易表与分类账!但是我只是通过查询这两个表来获得所需的输出。

这就是我的尝试,

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"分开和" Cr"分离?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

试试这个:

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

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