2016-02-11 97 views
1

Sql Server 2008 Datediff帶有select語句中的條件。datediff帶有選擇條件的條件

我有下面的查詢,需要幫助理解爲什麼我得到這些結果和我的問題的最佳解決方案。

SELECT DISTINCT l.program, l.id 
    ,(DATEDIFF(DAY, B.FIRST_DT , B.FIRST_second_DT))days_between1 
    ,(DATEDIFF(DAY, C.FIRST_DT , C.FIRST_second_DT))days_between2  
FROM l 
LEFT JOIN l B ON L.id = B.id AND L.SERVICE_DATE = B.SERVICE_DATE 
       AND B.FIRST_DT IS NOT NULL AND B.FIRST_DT IS NOT NULL 
       AND l.IS ='0' AND L.FIRST_V_DT IS NOT NULL 
LEFT JOIN l C ON L.id = C.id AND L.SERVICE_DATE = C.SERVICE_DATE 
       AND C.FIRST_DT IS NOT NULL 
       AND C.FIRST_A_DT IS NOT NULL AND L.IS ='1' 
       AND L.FIRST_DT IS NOT NULL 
WHERE 1=1 

我得到兩條線

Program id daysbetween1  daysbetween2 
blue  1  null    3 
blue  1   4    null 

如何獲取一條線,如下圖所示,爲什麼我會收到兩行呢?

Program id daysbetween1  daysbetween2 
blue  1  4    3 
+0

示例數據將有助於此處。 http://stackoverflow.com/help/how-to-ask –

+0

當然,你會得到不同的行,要麼L.IS ='0'或L.IS ='1'... – jarlh

+0

是要做我的L .IS = 0 AND L.IS = 1和我的內部聯接。我將處理樣本數據。 –

回答

2

你可以試試這個方法:

SELECT l.program, l.id 
    ,MAX((DATEDIFF(DAY, B.FIRST_DT , B.FIRST_second_DT))) days_between1 
    ,MAX((DATEDIFF(DAY, C.FIRST_DT , C.FIRST_second_DT))) days_between2  
FROM l 
LEFT JOIN l B ON L.id = B.id AND L.SERVICE_DATE = B.SERVICE_DATE 
       AND B.FIRST_DT IS NOT NULL AND B.FIRST_DT IS NOT NULL 
       AND l.IS ='0' AND L.FIRST_V_DT IS NOT NULL 
LEFT JOIN l C ON L.id = C.id AND L.SERVICE_DATE = C.SERVICE_DATE 
       AND C.FIRST_DT IS NOT NULL 
       AND C.FIRST_A_DT IS NOT NULL AND L.IS ='1' 
       AND L.FIRST_DT IS NOT NULL 
GROUP BY l.program, l.id 

where條件是不必要的,除非你正在從某種過濾器的動態級聯這個SQL。