我正在尝试从数据挖掘会计软件中获取报告。
我们有一个表格,用于存储每个帐户在给定期间的总帐中的余额(0-12,0表示去年结转,1-12表示相应的月份),金额和我不需要的其他数据。
我尝试每个月为每个帐户获取一个值失败,但是并不总是有相应的条目。我已经尝试过左外连接,交叉连接,内连接,似乎无法按照我想要的方式工作。我甚至尝试使用包含'Initial'作为项目0和其他12个条目的表来执行左外连接,每个月都有一个名称。
以下是数据样本:
GLBalances表:
acct_no | post_prd | post_trn_amt
1011 | 0 | -15000
1011 | 1 | 5000
1011 | 2 | -6000
1011 | 4 | 8000
1020 | 5 | 100
1020 | 12 | 300
1011 | 9 | 500
1011 | 8 | 0
etc...
我想知道的是:
acct_no | post_prd | post_trn_amt
1011 | 0 | -15000
1011 | 1 | 5000
1011 | 2 | -6000
1011 | 3 | 0
1011 | 4 | 8000
1011 | 5 | 0
1011 | 6 | 0
1011 | 7 | 0
1011 | 8 | 0
1011 | 9 | 500
1011 | 10 | 0
1011 | 11 | 0
1011 | 12 | 0
1020 | 0 | 0
1020 | 1 | 0
1020 | 2 | 0
1020 | 3 | 0
1020 | 4 | 0
1020 | 5 | 100
1020 | 6 | 0
1020 | 7 | 0
1020 | 8 | 0
1020 | 9 | 0
1020 | 10 | 0
1020 | 11 | 0
1020 | 12 | 300
等...
因此,特定年份的每个帐户基本上有13个条目,即使该期间没有条目。
我确信这比我制作它更容易,我只是苦苦挣扎,因为我每天都不处理SQL。任何帮助将不胜感激。
答案 0 :(得分:6)
您可以使用交叉加入创建一张有效帐户和月份。使用左连接查找相应的“实际”行,然后设置:
;with months as
(
select 0 as Month
union all
select Month + 1 from months where Month < 12
)
select a.acct_no, m.month as post_prd, IsNull(g.post_trn_amt,0)
from months m
cross join (select distinct acct_no from @GLBalances) a
left join @GLBalances g
on m.month = g.post_prd
and a.acct_no = g.acct_no
order by a.acct_no, m.month
“with months as”构造是一种创建包含数字0到12的表的奇特方法。您还可以创建包含这些数字的实际表,并取消“递归公用表表达式”构造。
这是我使用的测试数据:
declare @GLBalances table (acct_no int, post_prd int, post_trn_amt int)
insert into @GLBalances
select 1011,0,-15000
union all select 1011, 1, 5000
union all select 1011, 2, -6000
union all select 1011, 4, 8000
union all select 1020, 5, 100
union all select 1020, 12, 300
union all select 1011, 9, 500
union all select 1011, 8, 0