我不确定我哪里出错了。根据协议,我试图计算公司的小时数和终点数。然而,我的SUM()结果非常偏离正轨。
这是我的代码:
SELECT v_rpt_Company.Company_Name, v_rpt_Service.agreement_name,
COUNT(DISTINCT v_rpt_Service.TicketNbr) AS tickets,
SUM(ISNULL(v_rpt_Service.Hours_Agreement, 0)) AS hours,
SUM(ISNULL(AGR_Detail.AGD_Qty, 0)) AS endpoints
FROM AGR_Header
INNER JOIN v_rpt_Service
ON AGR_Header.AGR_Header_RecID = v_rpt_Service.AGR_Header_RecID
INNER JOIN v_rpt_Company
ON v_rpt_Service.company_recid = v_rpt_Company.Company_RecID AND
AGR_Header.Company_RecID = v_rpt_Company.Company_RecID
INNER JOIN AGR_Detail
ON AGR_Header.AGR_Header_RecID = AGR_Detail.AGR_Header_RecID
WHERE
(v_rpt_Service.date_entered >= DATEADD(day, - 30, GETDATE()))
AND
(v_rpt_Company.Company_RecID =
CASE
WHEN @Company <> - 1 THEN @Company
ELSE v_rpt_Company.Company_RecID
END)
AND
(v_rpt_Service.AGR_Header_RecID =
CASE
WHEN @Agreement <> - 1 THEN @Agreement
ELSE v_rpt_Service.AGR_Header_RecID
END)
GROUP BY v_rpt_Company.Company_Name, v_rpt_Service.agreement_name
ORDER BY v_rpt_Company.Company_Name, v_rpt_Service.agreement_name
答案 0 :(得分:0)
要调试这样的情况,您应该在开发计算机上设置一个测试数据库,您可以随时删除所有表,重建模式并使用特定的测试用例加载测试数据。
使用dbunit之类的工具。这样,即使需求发生变化,您也可以确保SQL按预期工作。
如果您的测试用例有效但生产数据库中的结果失败,请将生产数据库的一部分复制到开发数据库中并创建一个新的测试用例。
答案 1 :(得分:0)
WHERE子句的第二部分无法按计划运行:
(v_rpt_Company.Company_RecID =
CASE
WHEN @Company <> - 1 THEN @Company
ELSE v_rpt_Company.Company_RecID
END)
如果@ Company = -1,ELSE部分将匹配当前记录,基本上使结果始终为真。
答案 2 :(得分:0)
SELECT v_rpt_Company.Company_Name, v_rpt_Service.agreement_name, COUNT(DISTINCT v_rpt_Service.TicketNbr) AS tickets,
SUM(ISNULL(v_rpt_Service.Hours_Actual, 0)) AS hours,( SUM(ISNULL(AGR_Detail.AGD_Qty, 0))/COUNT(DISTINCT v_rpt_Service.TicketNbr)) AS endpoints
结果是正确的结果。谢谢DavidFaber。