2010-07-14 97 views
4

我有一個函數需要2個參數:@iEmployeeID@dDateSQL函數返回錯誤值

它的目的是找到給定參數的預算費率。換句話說,它應該找到最大日期小於或等於@dDate參數,並返回相應的比率。

預算率:

 
Start  Rate 
-------  ----- 
01-01-2008 600 
01-01-2009 800 
01-01-2010 700 
DECLARE @result decimal(38,20) 

SELECT @result = decRate 
FROM BudgetRates BR 
WHERE BR.iRefEmployeeID = @iEmployeeID 
GROUP BY decRate 
HAVING MAX(BR.dStart) <= @dDate 

RETURN @result 

  • 當提供的參數06-06-2008,它正確地返回600
  • 當提供的參數03-03-2009,它正確地返回800
  • 當提供了argume 02-02-2010,它應該返回700.該函數實際上返回800.

錯誤在哪裏?

尋找錯誤: 如果我對數據做了調整,它似乎選擇了最大的速率,如果它有2個值可供選擇。

+0

bughunting:現在,如果我「廢墟」我的數據和編輯700速度810它正確地挑選這個速度時的問題是2010年2月2日。 – DoStuffZ 2010-07-14 13:58:04

+0

啊,有東西。 解給出正確答案: DECLARE @result十進制(38,20) SELECT TOP 1 @result = decRateWeekday FROM tbl_eCon_Target_BudgetRates BR WHERE BR.iRefEmployeeID = @iEmployeeID GROUP BY decRateWeekday,DSTART HAVING MAX(BR .dStart)<= @ dDate ORDER BY dStart DESC RETURN @result 非常感謝你的幫助,我真的很感激它。 – DoStuffZ 2010-07-14 14:02:38

回答

4

當然你的代碼不應該在所有分組選擇頂部1?

SELECT TOP 1 @result = decRate 
FROM BudgetRates BR 
WHERE BR.iRefEmployeeID = @iEmployeeID 
AND BR.dStart <= @dDate 
ORDER BY BR.dStart DESC 

RETURN @result 
+0

當我省略GROUP BY我得到:列'BudgetRates.decRate'在選擇列表無效,因爲它不包含在集合函數或GROUP BY子句。 Top 1選擇600. – DoStuffZ 2010-07-14 13:51:29

+2

@DoStuffz - 如果您收到該消息,則不能排除GROUP BY。 – 2010-07-14 13:54:57

+1

@DoStuffz:如果'TOP 1'選擇了600的速率,那聽起來就好像你在'ORDER BY'上放棄了'DESC'。 – 2010-07-14 14:00:47

1

你應該使用TOP 1得到相應的一個與ORDER BY

DECLARE @result decimal(38,20) 

SELECT TOP 1 @result = decRate 
FROM BudgetRates BR 
WHERE BR.iRefEmployeeID = @iEmployeeID 
ORDER BY decRate DESC 

RETURN @result 
+0

當我這樣做,我得到。 「函數內的副作用運算符'SET ROW COUNT'的使用無效。」 – DoStuffZ 2010-07-14 13:49:44

+0

哦..我忘了你不能這樣做的功能..糾正前1 – 2010-07-14 14:03:53

0

試試這個隊友:

select @result = decRate 
    from BudgetRates 
     inner join (
     select max(BR.dStart) as MaxDate 
     from BudgetRates 
     where BR.dStart <= @dDate 
     and BR.iRefEmployeeID = @iEmployeeID 
       ) temp on tmep.MaxDate = BudgetRates.dStart 
        and BudgetRates.iRefEmployeeID = @iEmployeeID 
1

好像你都應該在這裏使用排序功能。

DECLARE @result decimal(38,20) 

SELECT @result = decRate 
(
    SELECT decRate, ROW_NUMBER() OVER (ORDER BY BR.dStart DESC) rownum 
    FROM BudgetRates BR 
    WHERE BR.iRefEmployeeID = @iEmployeeID 
    AND BR.dStart <= @dDate 
) sub 
WHERE rownum = 1 

RETURN @result