在MySql中通过Sql创建试算平衡

时间:2014-02-13 10:49:19

标签: mysql

我是Sql的新手,需要一些指导才能通过MySql中的Sql查询创建试算平衡。 请考虑以下情形:

两个表:

  • Accounts

  • Transactions

Accounts表字段详细信息:

  • AccNo(PK)(varchar)(5)

  • AccName(varchar)(50)

  • AccOpBal(double

Transactions表字段详细信息:

  • TransID(int)(自动增量)(PK)

  • AccNo(varchar)(5)

  • TransDt(DateTime

  • TransDebit(Double

  • TransCredit(Double

现在我需要一个基于transDt日期范围的SQL查询(例如2014年1月1日至1月31日至1月31日),它将返回:

AccNo

AccOpBal

TransDebit(每月交易总额,即2014年1月)

TransCredit(每月交易总额,即2014年1月)

TransDebit每年交易总和,即2013年7月1日至2014年1月31日或年初至今)

TransCredit每年交易总和,即2013年7月1日至2014年1月31日或年初至今)

每个AccNo都没有必要有余额(AccOpBal),同样,每个AccNo都没有必要进行交易(TransDebit或{{ 1}})。但是如果TransCredit有任何问题,那么它应该在查询中。

UPDATE添加了样本试用版的图片 SampleTrialBalance

1 个答案:

答案 0 :(得分:2)

您可以通过选择两个查询的联合来实现该结果,一个用于当前月份,一个用于年初至今的数字。

select accno, accopbal, sum(mtd_d), sum(mtd_c), sum(ytd_d),sum(ytd_c)
from 
(   select ao.accno
         , ao.accOpBal
         , 0 as mtd_d
         , 0 as mtd_c
         , 0 as ytd_d
         , 0 as ytd_c
    from accounts ao
    left outer join transactions tn on tn.accno = ao.accno
    where tn.accno is null
    union
    select tm.accno
         , a.accOpBal
         , sum(tm.transdebit) as mtd_d
         , sum(tm.transcredit) as mtd_c
         , 0 as ytd_d
         , 0 as ytd_c
    from accounts a
    right outer join transactions tm on tm.accno = a.accno
    where tm.transdt between '2014-01-01' and '2014-01-31'
    group by a.accno, a.accopbal
    union 
    select ty.accno
         , a.accOpBal
         , 0
         , 0
         , sum(ty.transdebit)
         , sum(ty.transcredit)
    from accounts a
    right outer join transactions ty on ty.accno = a.accno
    and ty.transdt between '2013-07-01' and  '2014-01-31'
    group by a.accno, a.accopbal
) alltxn
group by accno, accopbal

这是一个sqlfiddle,其中包含一个小测试集

这是测试集:

-- january
insert into transactions values (1, 'alfki', '2014-01-01', 1,3); 
insert into transactions values (1, 'alfki', '2014-01-02', 1,3); 
insert into transactions values (1, 'alfki', '2014-01-03', 1,3); 

-- last year
insert into transactions values (1, 'alfki', '2013-09-01', 5,2);

-- txn without acc
insert into transactions values (1, 'noexi', '2014-01-03', 4,2); 


-- acc with txn
INSERT INTO Accounts values ( 'alfki', 'alfred', 4);
-- acc without txn
INSERT INTO Accounts values ( 'lefto', 'lefto', 6);

使用以下查询结果:

ACCNO | ACCOPBAL |SUM(MTD_D)|SUM(MTD_C)|SUM(YTD_D)|SUM(YTD_C)
------+----------+----------+----------+----------+-----------
alfki |  4       |      3   |     9    |    8     |   11
lefto |  6       |      0   |     0    |    0     |    0
noexi | (null)   |      4   |     2    |    4     |    2