Функция SQL возвращает неправильное значение - PullRequest
4 голосов
/ 14 июля 2010

У меня есть функция, которая принимает 2 параметра: @iEmployeeID и @dDate.

Ее цель - найти бюджетную ставку для данных параметров.Другими словами, он должен найти наибольшую дату, меньшую или равную аргументу @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
  • Когда передается аргумент02-02-2010, должно возвращаться 700. Функция на самом деле возвращает 800.

Где ошибка?

охота на ошибки: если я настраиваю цифры, кажется, чтосамая большая ставка, если у нее есть 2 значения для выбора.

Ответы [ 4 ]

4 голосов
/ 14 июля 2010

Неужели ваш код вообще не должен группироваться?

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

RETURN @result
1 голос
/ 14 июля 2010

Похоже, вы должны использовать здесь функции ранжирования.

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
1 голос
/ 14 июля 2010

Вы должны выбрать топ 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 голосов
/ 14 июля 2010

попробуйте это сопряжение

...