【问题标题】:Getting Monthly Data Even If Empty获取每月数据,即使是空的
【发布时间】:2009-10-28 19:21:47
【问题描述】:

我正在尝试通过对我们的会计软件进行数据挖掘来获得一份报告。

我们有一个表格,其中存储了给定期间(0-12,0 是从去年结转,1-12 是相应月份)总帐中每个帐户的余额,金额和我不需要的其他数据。

我没有成功地为每个帐户获取每个月的值,但并不总是有对应的条目。我已经尝试过左外连接、交叉连接、内连接,但似乎无法让它按我想要的方式工作。我什至尝试使用包含“初始”作为第 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。任何帮助将不胜感激。

【问题讨论】:

  • 什么数据库?如果 SQL Server 2005+ 或 Oracle 9i+,递归查询将创建一个数字列表 - 否则您必须自己创建一个表(或临时表)并填充它,然后 LEFT JOIN 到 GL 表中......
  • 这是一个 SQL Server 2005 数据库,我正在尝试通过 Access 进行数据访问/等,因此我可以快速生成一个简单的报告。
  • 是否有一个accounts表存储了所有的帐号?那张表中的所有内容都是这三列吗?
  • 有一个表,其中包含每个帐户编号、描述和一些其他杂项数据。不,这还不是 GLBalances 表中的全部内容,还有 cmpny_cd、acct_no、post_yr、post_prd、post_trn_amt、time_stamp。在我在此评论开头提到的另一个表中,有 cmpny_cd、acct_no、acct_desc,然后是大约 15-20 个字段,这些字段似乎是其他表关系的标志和 id。我对创建表格的软件不是超级熟悉,所以我不知道所有其他字段是什么。

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


【解决方案1】:

您可以使用交叉连接创建一张有效帐户和月份的表格。使用左连接查找相应的“真实”行,然后您就设置好了:

;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

【讨论】:

  • +1。用可行的代码很好的简洁答案。与我的第二个链接中的代码几乎相同,但已经针对@Josh 的需要进行了修改。再次,很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2021-11-18
  • 2019-12-03
  • 2020-04-26
  • 2012-09-22
  • 1970-01-01
相关资源
最近更新 更多