使用SUM()的结果不正确

时间:2012-03-06 15:28:35

标签: sql

我不确定我哪里出错了。根据协议,我试图计算公司的小时数和终点数。然而,我的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

3 个答案:

答案 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。