基于 2 个不同列的 2 个日期范围计数
Count Based on 2 date Ranges for 2 different columns
撰写报告时遇到问题。
我正在尝试计算发出和通过的查询数量,它们都有一个日期时间字段
我遇到的问题是返回的结果不正确。
运行 这段代码给了我 126 作为 passed
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)
时,您计算的只是具有该字段值的行。关于日期是否在特定范围内绝对没有逻辑。
实际上,如果 none 行重叠(即,右侧范围内 passed
的所有行与右侧 issued
的行不同范围)并且所有行都有一个日期,你实际上会得到一个大到 349 的数字(即 126 + 223)。
解决方案:有两个单独的查询有什么问题?您需要基于两个不同标准的两个不同数字,因此您要分别选择它们。那不是糟糕的设计;这非常明智。
撰写报告时遇到问题。 我正在尝试计算发出和通过的查询数量,它们都有一个日期时间字段
我遇到的问题是返回的结果不正确。
运行 这段代码给了我 126 作为 passed
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)
时,您计算的只是具有该字段值的行。关于日期是否在特定范围内绝对没有逻辑。
实际上,如果 none 行重叠(即,右侧范围内 passed
的所有行与右侧 issued
的行不同范围)并且所有行都有一个日期,你实际上会得到一个大到 349 的数字(即 126 + 223)。
解决方案:有两个单独的查询有什么问题?您需要基于两个不同标准的两个不同数字,因此您要分别选择它们。那不是糟糕的设计;这非常明智。