计数基于2个不同列的2个日期范围

时间:2016-08-04 15:51:26

标签: sql datetime count date-range

撰写报告时遇到问题。 我试图依靠发出和通过的查询数量,他们都有一个日期时间字段

我遇到的问题是结果不正确。

运行此代码会给我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 我尝试了很多不同的变化,但仍然无法得到正确的数字 我希望我已经解释得很好,任何帮助都会非常感激。 生锈的

2 个答案:

答案 0 :(得分: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) 

答案 1 :(得分:1)

当您在上一次查询中执行COUNT(pm.DateAppIssued)时,您所计算的所有行都是 具有该字段值的行 。关于日期是否在特定范围内,完全没有逻辑。

事实上,如果没有行重叠(即,右侧范围内passed的所有行与右侧范围内issued的行不同,则可能)并且所有行都有一个日期,你实际上得到的数字大到349(即126 + 223)。

解决方案 :有两个单独的查询有什么问题?您希望根据两个不同的标准使用两个不同的数字,因此您需要单独选择它们。这不错的设计;这是非常明智的。