2016-08-04 64 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