2011-11-13 4 views
0

私は初心者ですが紛失してしまいました!私はユーザー定義関数と入力パラメータとしてCustomerIDを使用して計算を実行しようとしています。 1行の計算を実行している場合、計算が機能しているようです。UDFによる正確な計算に問題があります

ただし、単一の顧客が多数のサポートコールを行うことができるため、顧客は複数の行の料金を請求することができます。

私がCustomerID1を使用して計算しようとすると、私が得る額は正確ではありません。私はこのコードを逆さまにして、これをどうやって得るのか理解できません。

ここにはテーブルのスナップショップへのリンクがあります:私は新しく画像を添付できません。 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

どれでも助けにすべきで大幅に高く評価されます。

答えて

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) 
+0

はそうありがとうあなたの入力のために多くの。あなたは私に表現を再加工させ、これを働かせるように提案しました!感謝万円! – Asynchronous