2016-08-02 20 views
1

3つのテーブルを結合し、結合のためにレコードが一致しない2番目と3番目のテーブルでnullを削除します。私は結果が得られましたが、nullを取り除くことができず、なぜこのクエリをSSRSに取り込むとレコードが失われるのでしょうか。SQL Serverの2番目と3番目のテーブルから3つのテーブルに参加し、NULLを削除する

ここに私の3つのテーブルと結果があります。

表A

enter image description here

表B

enter image description here

表C

enter image description here

私は取得していますどのような現在の結果私は青で、結果の上に取得していたから、次のように次のクエリ

enter image description here

で私のクエリがあります。

SELECT  
    d.ProviderName, d.Service, d.ClientName, d.[StartDate&Time], 
    d.Duration, d.Status, d.VisitTyoe, 
    i.IndirectType, i.IndirectScheduleStart, i.IndirectStatus, i.IndirectDuration, 
    e.[Date], e.[SubProgram], e.[ApprovedMileage], 
    e.[Status], e.[TravelTime], e.[StipendsTravelTime] 
FROM   
    V_DirectDetails d 
FULL OUTER JOIN 
    V_IndirectDetails i ON d.ProviderName = i.ProviderName 
         AND d.[StartDate&Time] = i.IndirectScheduleStart 
FULL OUTER JOIN  
    [dbo].[V_ExpenseDetails] e ON d.ProviderName = e.ProviderName 
           AND d.[StartDate&Time] = e.[Date] 

私はこれをSSRSレポートに格納しようとしましたが、次のクエリをストアドプロシージャとして使用すると、最後の行が失われています。ここで

はSSRSストアドプロシージャのクエリである:ここで

@Office NVARCHAR(4000), 
    @Servicetype NVARCHAR(4000), 
    @Start DATETIME, 
    @End DATETIME, 
    @employee nvarchar(400) 

SELECT  
    d.ProviderName, d.Service as DirectServices, d.ClientName, 
    d.[StartDate&Time] as "DirectStartDate&Time", d.Duration as DirectDuration, 
    d.Status as DirectStatus, d.VisitTyoe as DirectVisittype, 
    i.IndirectType as IndirectVisitType, i.IndirectScheduleStart as "IndirectStartDate&Time", 
    i.IndirectStatus as IndirectStatus, i.IndirectDuration as IndirectDuration, 
    e.[Date] as "TravelDate&Time", e.[SubProgram], e.[ApprovedMileage], 
    e.[Status] as TravelTimeStatus, e.[TravelTime], e.[StipendsTravelTime] 
FROM   
    V_DirectDetails d 
FULL OUTER JOIN 
    V_IndirectDetails i ON d.ProviderName = i.ProviderName 
         AND d.[StartDate&Time] = i.IndirectScheduleStart 
FULL OUTER JOIN   
    [dbo].[V_ExpenseDetails] e ON d.ProviderName = e.ProviderName 
           AND d.[StartDate&Time] = e.[Date] 
WHERE 
    CAST(d.[StartDate&Time] AS DATE) BETWEEN '2016-07-28' AND '2016-07-29' 
    AND d.[siteidname] = 'CountrySide' 
    AND d.title = 'Painter' 
    AND d.ProviderName = 'Peter A' 
ORDER BY 
    d.ProviderName 

は、私はSSRSクエリを通じて取得していますものです:

enter image description here

私の予想結果はC、表A、Bを配置することですテーブルAは6、テーブルBは4、テーブルCは3つの行を持つので、テーブルの最後の2行にヌル/空を表示し、テーブルのCの最後の3行にヌルを表示する。

可能であれば、ご案内ください。

+0

編集いただきありがとうございます。私は次回これらの変更を確認します。 – user2040021

答えて

1

であなたの日付フィルタを交換して、それを修正してみてください。

WHERE 
(
    CAST(d.[StartDate&Time] AS DATE) BETWEEN '2016-07-28' AND '2016-07-29' 
    AND d.[siteidname] = 'CountrySide' 
    AND d.title = 'Painter' 
    AND d.ProviderName = 'Peter A' 
) 
OR d.ProviderName IS NULL 

またはより良い派生表に条件を移動します:

FROM 
( 
    SELECT * 
    FROM V_DirectDetails 
    WHERE 
     CAST(d.[StartDate&Time] AS DATE) BETWEEN '2016-07-28' AND '2016-07-29' 
     AND d.[siteidname] = 'CountrySide' 
     AND d.title = 'Painter' 
     AND d.ProviderName = 'Peter A' 
) d 
FULL OUTER JOIN 
    V_IndirectDetails i ON d.ProviderName = i.ProviderName 
         AND d.[StartDate&Time] = i.IndirectScheduleStart 
FULL OUTER JOIN   
    [dbo].[V_ExpenseDetails] e ON d.ProviderName = e.ProviderName 
           AND d.[StartDate&Time] = e.[Date] 
+0

あなたの努力のために '@dnoeth'ありがとうございました。私はすでにこの作業を「@ niketshah90」ソリューションで完了しようとしています。私はまた、私が望む結果を得ましたが、今はSSRSの問題のように見えますが、レコードは6番目のレコードであるnullで始まっていますが間接的なアクティビティのデータはありますが、全く表示されません。 – user2040021

+0

ありがとう '@dnoeth' – user2040021

+0

皆さんこんにちは、私はこれを解決できました。私はすでに言及しているかどうかはわかりませんが、SSRSブラウザーではキャッシュの問題だったので、VSを再起動して、すべてがそのポイント以降で動作しています。ありがとう '@dnoeth'、@ niketshah90、みんな。 – user2040021

0

full outer joinleft joinに置き換えてください。

+0

表Aとの日付と時刻が一致しないと思うので、「準備」と書かれている表Bの4番目のレコードはまだありません。 – user2040021

1

dにWHERE条件がRIGHT JOINに結果を変更CAST(coalesce(d.[StartDate&Time],i.IndirectScheduleStart,e.[Date]) AS DATE) BETWEEN '2016-07-28' AND '2016-07-29'

+0

まだ6レコードしか表示されていません。:-(。私は、AS日付の前にカンマが正しく入力されていると信じています?それは私が店舗procを実行することを許可しないためです – user2040021

+0

こんにちは、 BSTWEEN開始と終了の間に、 が合体しています(d。[siteidname]、i。[siteidname]、e)。以下のように、CAST(coalesce(d。[StartDate&Time]、i.IndirectScheduleStart、 (d.ProviderName、i.ProviderName、e.ProviderName)=従業員 – user2040021

+0

その仕事は?基本的にはnullですか?値はフィルタリングされているので、あなたのパラメータのV_IndirectDetailsです。@dnoethによって提供されるソリューションは、あまりにも動作する必要があります – niketshah90

0

ブルートフォース!

UPDATE TABLE SET COL = CASE WHEN COL IS NULL THEN ENTERYOURVALUEHERE ELSE COL END 
+0

うわー、それは独創的な考えです。あなたのニーズに合わせてデータを変更するだけです。ない。そして、あなたのステートメントは '更新テーブルセットCOL = ENTERYOURVALUEHERE COLがNULLの場合 ' – dnoeth

+0

@dnoethでなければなりません、あなたはすべて最高です!おめでとう!背中に自分自身を叩く、あなたはそれをやった!それは皮肉と風刺ですか? 1つでは、いいえ... 2文章?? NIce !! touché – StelioK

+0

ようこそ。 Btw、NULLは外部結合のために、それらを更新する方法でしたか? – dnoeth

関連する問題