计数基于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号我尝试了许多不同的变体,但仍然无法得到正确的数字我希望我已经很好地解释了这一点,任何帮助都将不胜感激。生锈的

因为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) 

在上一个查询中执行COUNT(pm.DateAppIssued)时,所计数的只是具有该字段值的行。关于日期是否在特定范围内,绝对没有逻辑。

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

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

相关内容

  • 没有找到相关文章

最新更新