2016-08-04 61 views
1

寫一個報告有問題。 我試圖指望發佈和通過的查詢數量,他們都有一個日期時間字段根據2個日期範圍計算2個不同列

即時通訊的問題是結果回來不正確。

運行這段代碼給了我126通過

SELECT COUNT(*) AS Passed FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) AND CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End 

當我運行所發出的查詢,我得到223個

SELECT COUNT(*) AS Issued FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) AND CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End 

這些數字是正確的,所以我把它放在一個查詢像這樣。

SELECT COUNT(pm.DateAppIssued) AS Issued,COUNT(pm.DatePassed) AS Passed FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm 
ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) 
AND (CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End 
OR CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End) 

這給我頒發265,並通過185 我已經嘗試了許多不同的變化,但不能仍然得到正確的數字 我希望我已經解釋過這個不夠好,任何幫助,將不勝感激。 Rusty

回答

2

因爲您具有where子句中的條件和or條件,您會看到不同的結果。在聚合本身中使用它們。

SELECT 
COUNT(case when CONVERT(DATE,pm.DateAppIssued,103) BETWEEN @Start AND @End then 1 end) AS Issued, 
COUNT(case when CONVERT(DATE,pm.DatePassed,103) BETWEEN @Start AND @End then 1 end) AS Passed 
FROM BPS.dbo.tbl_Profile AS p 
Inner Join BPS.dbo.tbl_Profile_Mortgage AS pm ON p.Id = pm.FK_ProfileId 
WHERE p.CaseTypeId IN (1,2,9,15) 
+0

感謝VKP非常感謝,所以基本上你說如果有一個日期在發佈或通過匹配的日期範圍,然後算作1.這是一個完美的解決方案,我認爲我可以在where子句中實現這一點。我將保存此代碼以供將來使用,因爲我擁有這樣的報告。 – RustyHamster

1

當你在最後一個查詢做COUNT(pm.DateAppIssued),你就指望是擁有該領域值的行。關於日期是否在特定範圍內絕對沒有邏輯。

事實上,如果沒有任何行重疊(即右邊範圍內的passed與右邊範圍內的issued不同的行)並且所有行都有日期,實際上得到的數字大到349(即126 + 223)。

解決方案:有兩個單獨的查詢有什麼問題嗎?你需要根據兩個不同的標準得到兩個不同的數字,所以你要單獨選擇它們。這不是壞的設計;這是非常明智的。

+0

嗨VoteyDisciple im使用報告生成器來顯示查詢的結果,你不能添加到不同的查詢到一個數據集,這意味着我不能將兩個查詢添加到一個表 – RustyHamster