我一直在寻找这方面的答案,但没有找到任何有用的结果。
有点背景故事:
我有大约20k项目,我正在尝试做一生的销售历史报告。有些项目有历史来自1/1/2005。销售仅在发生日期时注明。
尝试按天计算销售历史的第一个生命周期,销售的前6mo和销售的最后30天。我没有权限添加临时表,所以我正在导入一个excel文件。 (由于某种原因,你不能将其外部加入到发票日期。我猜是因为它是外部的?)
我的问题是,有一种简单的方法可以告诉水晶在没有查找表的情况下包含/打印缺少的日期。我已经将参数的开始和结束日期传递给了。
是否有办法在{?PM-Start}到{?PM-End}之间动态生成缺少的日期?使用查找表检查从1/1/2005-currentdate匹配的所有天数是否需要检查90,000,000,000个额外的bloops。
这需要几个小时才能运行。它应该能够获取最小值(sale_date)和最大值(sale_date)并且每天记录一个记录,无论它是否存在于数据库中。 (这怎么不是基本功能?)
或者我只是错过了一些超级简单的东西?
答案 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;