2016-09-19 9 views
0

私はoppsを取り込み、各月の期間と収益を計算する次のクエリを持っています。ただし、データがない場所では、数ヶ月が欠落しています。基本的には、場所とレコードの種類ごとにすべての月が表示されます。私はカレンダー上で左外部結合を試みたが、どちらもうまくいかないようだ。ここで各場所の月間ギャップを表示

はクエリです:

;With DateSequence([Date]) as 
(
    Select CAST(@fromdate as DATE) as [Date] 
     union all 
    Select CAST(dateadd(day, 1, [Date]) as Date) 
     from DateSequence 
     where Date < @todate 
) 


INSERT INTO CalendarTemp (Date, Day, DayOfWeek, DayOfYear, WeekOfYear, Month, MonthName, Year) 

Select 
    [Date] as [Date], 
    DATEPART(DAY,[Date]) as [Day], 
    DATENAME(dw, [Date]) as [DayOfWeek], 
    DATEPART(DAYOFYEAR,[Date]) as [DayOfYear], 
    DATEPART(WEEK,[Date]) as [WeekOfYear], 
    DATEPART(MONTH,[Date]) as [Month], 
    DATENAME(MONTH,[Date]) as [MonthName], 
    DATEPART(YEAR,[Date]) as [Year] 

from DateSequence option (MaxRecursion 10000) 
; 

DELETE FROM CalendarTemp WHERE DayOfWeek IN ('Saturday', 'Sunday'); 


SELECT 
AccountId 
,AccountName 
,Office 
,Stage = (CASE WHEN StageName = 'Closed Won' THEN 'Closed Won' 
    ELSE 'Open' 
    END) 
,Id 
,Name 
,RecordType= (CASE 
         WHEN recordtypeid = 'LAS1' THEN 'S' 
          END) 
,Start_Date 
,End_Date 
,Probability 
,Estimated_Revenue_Won = ISNULL(Amount, 0) 
,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Name) AS Row 
--,Revenue_Per_Day = CAST(ISNULL(Amount/NULLIF(dbo.CalculateNumberOFWorkDays(Start_Date, End_Date),0),0) as money) 
,YEAR(c.Date) as year 
,MONTH(c.Date) as Month 
,c.MonthName 
--, ISNULL(CAST(Sum((Amount)/NULLIF(dbo.CalculateNumberOFWorkDays(Start_Date, End_Date),0)) as money),0) As RevenuePerMonth 


FROM SF_Extracted_Opps o 
LEFT OUTER JOIN CalendarTemp c on o.Start_Date <= c.Date AND o.End_Date >= c.Date 


WHERE 
Start_Date <= @todate AND End_Date >= @fromdate 
AND Office IN (@Location) 
AND recordtypeid IN ('LAS1') 



GROUP BY 
AccountId 
,AccountName 
,Office 
,(CASE WHEN StageName = 'Closed Won' THEN 'Closed Won' 
    ELSE 'Open' 
    END) 
,Id 
,Name 
,(CASE 
     WHEN recordtypeid = 'LAS1' THEN 'S' 

END) 
,Amount 
--, CAST(ISNULL(Amount/NULLIF(dbo.CalculateNumberOFWorkDays(Start_Date, End_Date),0),0) as money) 
,Start_Date 
,End_Date 
,Probability 
,YEAR(c.Date) 
,Month(c.Date) 
,c.MonthName 
,dbo.CalculateNumberOFWorkDays(Start_Date, End_Date) 


ORDER BY Office 
, (CASE 
     WHEN recordtypeid = 'LAS1' THEN 'S' 

END) 
,(CASE WHEN StageName = 'Closed Won' THEN 'Closed Won' 
    ELSE 'Open' 
    END) 
, [Start_Date], Month(c.Date), AccountName, Row; 

私は別の左外側がこれに参加し、これにサブクエリを使用して追加しようとした年と月に基づいたカレンダーに、本質的に参加するが、それはいないようでしたいずれかを動作させる。提案は非常に高く評価されます。

--Date Calendar for each location: 
;With DateSequence([Date], Locatio) as 
(
    Select CAST(@fromdate as DATE) as [Date], oo.Office as location 
     union all 
    Select CAST(dateadd(day, 1, [Date]) as Date), oo.Office as location 
     from DateSequence dts 
     join Opportunity_offices oo on 1 = 1 
     where Date < @todate 
) 

--select result 


INSERT INTO CalendarTemp (Location,Date, Day, DayOfWeek, DayOfYear, WeekOfYear, Month, MonthName, Year) 

Select 
    location, 
    [Date] as [Date], 
    DATEPART(DAY,[Date]) as [Day], 
    DATENAME(dw, [Date]) as [DayOfWeek], 
    DATEPART(DAYOFYEAR,[Date]) as [DayOfYear], 
    DATEPART(WEEK,[Date]) as [WeekOfYear], 
    DATEPART(MONTH,[Date]) as [Month], 
    DATENAME(MONTH,[Date]) as [MonthName], 
    DATEPART(YEAR,[Date]) as [Year] 

from DateSequence option (MaxRecursion 10000) 
; 
+0

LEFT JOINではなく、カレンダーに右ジョイントを試してください。 –

+0

LEFT JOIN左のコレクションからすべてのデータを返します。RIGHT JOINまたはスワップデータソースを使用してください。CalendarTemp c LEFT OUTER JOIN SF_Extracted_Opps o – steryd

答えて

1

あなたはすべてのCalendarTempからのレコードとSF_Extracted_Oppsから一致するものだけをしたいならば、あなたはCalendarTempは、左のテーブルである必要があり、左手には後方JOINを持っています。ただし、LEFT JOINをRIGHT JOINに切り替えることはできますが、修正する必要があります。もう一つの問題は、あなたのWHEREステートメントがあなたのSF_Extracted_Oppsテーブルからの列を使用していて、INNER JOINを再作成することだけです。

これは修正する方法の1つです。あなたはすべての日付が、私はまだ週末にテストして、あなたは異なる結果を得れば見ることが表現されていない、あなたのCalendarTemp表から週末を削除するので、あなたがに実行される可能性

SELECT 
..... 

FROM 
    CalendarTemp c 
    LEFT JOIN SF_Extracted_Opps o 
    ON o.Start_Date <= c.Date AND o.End_Date >= c.Date 
    AND o.Start_Date <= @todate AND End_Date >= @fromdate 
    AND o.Office IN (@Location) 
    AND o.recordtypeid IN ('LAS1') 

他の問題があります。

このライン:あなたのCalendarTempTableで

AND o.Start_Date <= @todate AND End_Date >= @fromdate 

すでに前の行からの日数を制限しているため、どちらか必要とすべきではないと値

あなたが持っていないあなたのCalendarDateテーブルについての注意戻ってそれらのレコードを削除するには、WHERE句としてその曜日を曜日に追加します。

すべてのオフィスの編集では、カレンダーを作成するcteではなく、最終的なクエリでカレンダーを作成するために、オフィステーブルとCalendarTempテーブルをクロスジョインすることができます。 CTEカレンダー定義でそれを行う際の問題は、再帰的であるため、アンカーメンバーと再帰メンバー定義の両方でそれを行う必要があるということです。

SELECT 
..... 

FROM 
    CalendarTemp c 
    CROSS JOIN Opportunity_offices oo 
    LEFT JOIN SF_Extracted_Opps o 
    ON o.Start_Date <= c.Date AND o.End_Date >= c.Date 
    AND o.Start_Date <= @todate AND End_Date >= @fromdate 
    AND oo.office = o.Office 
    AND o.recordtypeid IN ('LAS1') 
+1

チャームの感謝のように働いています。 – a415

+0

最後の1つの質問:これをすべての場所で実行したとき。私はこれを編集して、それぞれの場所に欠けている月を作成します。現時点ですべての場所でこれを実行すると、データセット全体に基づいて欠落した月が取得されます。基本的には、左の結合を実行し、各位置を考慮に入れるために必要です。 – a415

+0

レコードが存在するかどうかに関係なく、すべての場所とすべての日付を表示しますか? .e.gを選択してからcalendartempにクロス結合し、左の結合を変更して場所テーブルに関連付けるようにしてください – Matt

関連する問題