无法使用UDF进行准确计算

时间:2011-11-13 20:52:00

标签: sql-server

我是翻译中丢失的新手!我正在尝试使用用户定义函数和CustomerID作为输入参数来执行计算。 如果我正在执行计算单行,则计算似乎有效。

但是,由于单个客户可以拨打多个支持电话,因此客户可以收取多行费用。

如果我尝试使用CustomerID 1进行计算,我获得的金额并不准确。我已将这些代码颠倒过来,无法理解如何实现这一目标。

这是表格快照店的链接:我是新手,无法附加图片。 See table Snapshot to illustrated values and rows

这是功能:

CREATE FUNCTION dbo.CalulateTotal (@CustomerId INT) 
RETURNS MONEY 
AS 
BEGIN
DECLARE @GetTotalCost MONEY         
SELECT  @GetTotalCost = ISNULL((SUM(SupportHours) * MAX(CostPerHour)),0) + ISNULL((SUM(MilesTraveled) * MAX(CostPer_Mile)),0)
+ ISNULL((SUM(Supplies) + MAX(Misc)),0)
FROM tblSupportCharges                 
WHERE CustomerId = @CustomerId
GROUP BY CustomerId

RETURN @GetTotalCost
END

Select dbo.CalulateTotal(1)

计算CustomerId 1的结果应该是13而不是15。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

15似乎是正确的:

SELECT  @GetTotalCost = ISNULL((SUM(SupportHours) * MAX(CostPerHour)),0)
                      + ISNULL((SUM(MilesTraveled) * MAX(CostPer_Mile)),0)
                      + ISNULL((SUM(Supplies) + MAX(Misc)),0)


              ---     =       SUM(5, 2)           * MAX(2, 1)  
              ---     +       SUM(1, NULL)        * MAX(1, NULL) 
              ---     +       SUM(NULL,NULL) + MAX(NULL,NULL)  

              ---     =        7*2   +   1*1   +   0 

              ---     =   15

也许,您想要的不是SUM(SupportHours) * MAX(CostPerHour),而是想要:

SUM(SupportHours * CostPerHour)

您可能还想使用:

SUM(MilesTraveled * CostPer_Mile)