2017-09-19 3 views
0

私は数日間この回答を検索していますが、有用な結果は見つかりませんでした。Crystal Reportsの売上レポートは存在しない場合でもすべての日付を表示しています

裏話のビット:

私は生涯の販売履歴レポートをやろうとしている〜20kの項目について持っているon.Some項目は2005年1月1日からの歴史を持っています。売上高は発生日にのみ記録されます。

売上履歴の最初の有効期間を日数、最初の6営業日、最後の30日間の売上でグラフ化しようとしています。私は一時テーブルを追加する権限がありませんので、私はExcelファイルをインポートする作業をしています。 (何らかの理由でそれを外部に送り出すことができないので、私は外部にいるので推測しています)

私の問題は、欠落した日付を含む/印刷するようにクリスタルに伝える簡単な方法ですルックアップテーブルなし。私はすでに開始日と終了日をパラメータに渡しています。

{?PM-Start}から{?PM-End}までの間に欠落した日付を動的に生成する方法はありませんか?ルックアップテーブルを使用して、1/1/2005-currentdateの一致日数がすべて90,000,000,000であることを確認します。

実行には数時間かかることがあります。 DBに存在するかどうかにかかわらず、minumum(sale_date)、最大(sale_date)、および毎日のレコードを取得できます。 (これは既に基本的な機能ではないのですが)

私はただ単に何かが抜けていますか?

答えて

0

{?PM-Start}から{?PM-End}の間に欠落した日付を動的に生成する手段はありませんか?ルックアップテーブルを使用して、1/1/2005-currentdateの一致日数がすべて90,000,000,000であることを確認します。あなたが欠落している日付を埋めるためにカレンダービューを生成することができます下のようなクエリを使用することにより

;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

+0

私が使用していない 'datefromparts'への答えを編集します;)。 –

+0

それはそうしました。私は泣いている。どのような頭痛。どうもありがとうございます! – Steve

+0

クリスタルがあなたのかわいいコードを吹き飛ばすことなくstrin(datetime joinのため)として認識する前に、この文字列をDateValueにする方法はありますか?報告のSQL側はまだ私の頭の中で少しです。 – Steve

関連する問題