我正在尝试从数据挖掘我们的会计软件中获取报告.
我们有一个表格,用于存储每个帐户在给定期间的总帐中的余额(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.任何帮助将非常感激.
您可以使用交叉联接创建一张有效帐户和月份.使用左连接查找相应的"实际"行,并设置:
;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