Crystal Reports销售报告显示所有日期,即使不存在也是如此

时间:2017-09-19 14:59:06

标签: sql-server crystal-reports

我一直在寻找这方面的答案,但没有找到任何有用的结果。

有点背景故事:

我有大约20k项目,我正在尝试做一生的销售历史报告。有些项目有历史来自1/1/2005。销售仅在发生日期时注明。

尝试按天计算销售历史的第一个生命周期,销售的前6mo和销售的最后30天。我没有权限添加临时表,所以我正在导入一个excel文件。 (由于某种原因,你不能将其外部加入到发票日期。我猜是因为它是外部的?)

我的问题是,有一种简单的方法可以告诉水晶在没有查找表的情况下包含/打印缺少的日期。我已经将参数的开始和结束日期传递给了。

是否有办法在{?PM-Start}到{?PM-End}之间动态生成缺少的日期?使用查找表检查从1/1/2005-currentdate匹配的所有天数是否需要检查90,000,000,000个额外的bloops。

这需要几个小时才能运行。它应该能够获取最小值(sale_date)和最大值(sale_date)并且每天记录一个记录,无论它是否存在于数据库中。 (这怎么不是基本功能?)

或者我只是错过了一些超级简单的东西?

1 个答案:

答案 0 :(得分:0)

  

有没有办法在{?PM-Start}{?PM-End}之间动态生成缺失日期?使用查找表检查从1/1/2005-currentdate匹配的所有天数是否需要检查90,000,000,000个额外的bloops。

通过使用如下所示的查询,您可以生成日历视图以填充缺少的日期:

;with years(yyyy) as (
    select 2005
    union all
    select yyyy + 1
    from years
    where yyyy < datepart(year, getdate())
), months(mm) as (
    select 1
    union all
    select mm + 1
    from months
    where mm < 12
), allDays(dd) as (
    select 1
    union all 
    select dd + 1
    from allDays
    where dd < 31
), calendar as (
    select --datefromparts(y.yyyy, m.mm, d.dd) [date]
         cast(cast(y.yyyy as varchar(4))+'-'+cast(m.mm as varchar(2))+'-'+cast(d.dd as varchar(2)) as date) [date]
    from allDays d
    cross join
        months m
    cross join
        years y
    where isdate(cast(y.yyyy as varchar(4))+ '/'+cast(m.mm as varchar(2))+'/'+cast(d.dd as varchar(2))) <> 0
)
select *
from calendar;

SQL Fiddle Demo