0

最初にこの質問をここに投稿しましたが、残念ながら住宅ローン番号フィルターをダンプする必要があります。それが判明したのは苦痛です。

CTE を使用して日付の範囲を生成する次の LOJ クエリを使用しています。

Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;

SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';

With DateRange As (
    SELECT ID, Date
    FROM     d_Dates
    WHERE  (Date BETWEEN @inquiryStartDate AND @inquiryEndDate)
)
Select DateRange.ID, DateRange.Date,f_MortgageSnapshots.MortgageNumber, f_MortgageSnapshots.Investor_ID
From DateRange
LEFT OUTER JOIN f_MortgageSnapshots On DateRange.ID = f_MortgageSnapshots.SnapshotDate_ID

そして、私はこのようなものを得ています:

ここに画像の説明を入力

しかし、私はこれが欲しい:

ここに画像の説明を入力

私は何を間違っていますか?この場合、テーブル間の左結合を行うことはできませんか?

f_MortgageSnapshots テーブルには、住宅ローン 12345678 の行が 2 つだけあります。

ここに画像の説明を入力

不思議に思っている人のために、d_Dates テーブルを次に示します。

ここに画像の説明を入力

4

1 に答える 1

1

d_dates には、お問い合わせの日付範囲内のすべての可能な日付の行が含まれていないようです。

次のようなものを試してください:-

create function [dbo].BuildDataRange
(
    @StartDate date,
    @EndDate date
)
returns @returntable table
(
    ID int,
    [Date] date
)
as
begin
    while @StartDate<=@EndDate begin
        insert into @returntable (ID, [Date]) values (
            DATEPART(year,@StartDate)*10000 + 
            DATEPART(month,@StartDate)*100 + 
            DATEPART(day,@StartDate),
            @StartDate)
        set @StartDate=DATEADD(day,1,@StartDate)
    end
    return
end
go

そして、次のことができるはずです:-

Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;

SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';

select *
from [dbo].BuildDataRange(@inquiryStartDate, @inquiryEndDate) dr
left join f_MortgageSnapshots On dr.ID = f_MortgageSnapshots.SnapshotDate_ID
于 2013-10-24T01:25:42.723 に答える