我的任务是创建一个报告,该报告在过去365天内每天计算开放服务票证。如果没有完成日期,或者完成日期大于评估日期且创建日期小于或等于评估日期,则票证在任何给定日期被分类为未结。我的问题是我没有在报告中分组的日期字段,因为我无法对创建或解决的日期字段进行分组,因为我正在计算打开的故障单,并且可能在指定的日期没有创建或完成故障单。
我已经尝试创建一个命令,该命令每天列出,然后将其添加到报告中,没有连接,这当然会创建一个笛卡尔积,但这会使报告更快并且需要长时间运行。如何在给定时间段(在本例中为最后365天)中为每天创建一个组,我可以在其中放置公式来计算打开的票证?
是否有解决此问题的方法,任何帮助都非常感谢。我使用的是Crystal报告版本11.0.0.895
答案 0 :(得分:0)
这是您最好在数据库(或Crystal Reports中的查询/命令)中解决的任务。作为草图:
count
)这样,您将拥有一个始终包含365行的结果集,因此报表中不会出现任何问题。如果当天没有门票,则某些行可能包含0。
以下是一个例子。它使用日期表。它显示了将票证信息提供给指定日期的两种方法:
查看where / join条件(opened <= adate
和(closed is null or closed >= adate)
)是否完全代表您的需求(如果当天关闭的机票被视为当天未结,将是一张机票在同一天打开和关闭算作开放,......
create table #dates (adate date);
insert into #dates (adate) values
('2017-06-23'),
('2017-06-22'),
('2017-06-21'),
('2017-06-20'),
('2017-06-19')
create table #tickets (id int, opened date, closed date);
insert into #tickets (id, opened, closed) values
(1, '20170620', null),
(2, '20170620', '20170622'),
(3, '20170621', '20170622'),
(4, '20170624', null)
-- just the open tickets per day
select
adate
,(select count(id) from #tickets where opened <= adate and (closed is null or closed >= adate)) open_tickets
from #dates
left outer join #tickets on opened <= adate and (closed is null or closed >= adate)
-- tickets joined to date, all ticket information available
select
adate
,#tickets.*
from #dates
left outer join #tickets on opened <= adate and (closed is null or closed >= adate)
drop table #tickets
drop table #dates