获取每月数据即使是空的

时间:2009-10-28 19:21:48

标签: sql sql-server sql-server-2005 tsql

我正在尝试从数据挖掘会计软件中获取报告。

我们有一个表格,用于存储每个帐户在给定期间的总帐中的余额(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。任何帮助将不胜感激。

1 个答案:

答案 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