我是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添加了样本试用版的图片
答案 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