2016-08-02 98 views
1

我想加入3個表並刪除第2個和第3個表中由於連接而導致記錄不匹配的空值。我得到的結果,但無法刪除空,因此,當我把這個查詢到SSRS我失去了一個記錄。在SQL Server中加入3個表並刪除第2個和第3個表中的空值

這是我的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

我預期的結果是把表A,B,C因爲表A有6,表B有4,表C有3行,所以並排重複提供程序的名稱並在表B的最後2行中顯示空/空,並在表C的最後3行中顯示空值。

請指導,如果可以的話。

+0

感謝您的編輯。下次我會確定這些變化。 – user2040021

回答

1

d的WHERE條件的結果變爲RIGHT JOIN更換您的日期過濾器,試圖將其改爲:

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問題,記錄以null開頭,這是第6條記錄,但它確實有間接活動的數據,但它根本不顯示。 – user2040021

+0

感謝'@ dnoeth' – user2040021

+0

大家好,最後我能解決這個問題。我不確定我是否已經提到過,但這只是緩存問題,在我的SSRS瀏覽器中,我重新啓動了VS,並且所有內容都在正常工作。感謝'@ dnoeth',@ niketshah90和所有人。 – user2040021

0

將替換爲left join

+0

它仍然缺少表B中的第4條記錄,表示「準備」,因爲我認爲它沒有與表A匹配日期和時間。 – user2040021

1

CAST(coalesce(d.[StartDate&Time],i.IndirectScheduleStart,e.[Date]) AS DATE) BETWEEN '2016-07-28' AND '2016-07-29'

+0

它仍然只顯示6條記錄... :-(。我相信在AS日期之前的逗號只是輸入錯誤,因爲它不允許我運行存儲過程 – user2040021

+0

嗨,所以我已經將您的解決方案添加到其他參數以及隨後的CAST(合併(d。[StartDate&Time],i.IndirectScheduleStart,e。[Date])AS DATE)在開始與結束之間和 coalesce(d。[siteidname],i [[siteidname],e 。[siteidname])=辦公室和 coalesce(d.title,i.title,e.title)=服務類型和 coalesce(d.ProviderName,i.ProviderName,e.ProviderName)=員工 – user2040021

+0

這是否工作?基本上爲空因爲你的參數是V_IndirectDetails,我認爲@dnoeth提供的解決方案應該可以工作 – niketshah90

0

蠻力吧!

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

哇,這是一個巧妙的想法,只需修改數據以滿足您的需求。不。而你的聲明應該是'UPDATE TABLE SET COL = ENTERYOURVALUEHERE WHERE COL'NULL' – dnoeth

+0

@dnoeth,你是最棒的一切!恭喜!輕拍自己的背部,你做到了!這是諷刺和諷刺嗎?在一個,不... 2句話?會員NIce! touché – StelioK

+0

不客氣。順便說一句,NULL是由於外部連接,如何更新這些? – dnoeth