Я стараюсь избегать использования скалярных функций в моем проекте, поэтому я решил попробовать преобразовать одну из них в табличную функцию с помощью CTE.
Я понимаю, что производительность скалярных функций плохая, поскольку они должны выполняться для каждой строки, и SQL-сервер не может их оптимизировать каким-либо образом (т. Е. Он действует как черный ящик).
Вот моя первая попытка преобразовать ее в табличную функцию ...
CREATE FUNCTION [dbo].[fn_get_job_average] (@jobnumber VARCHAR(50))
RETURNS TABLE AS RETURN
(
WITH JobAverage AS
(
SELECT job.Jobnumber, CAST(AVG(CAST(jobMark.Mark AS DECIMAL(18,1))) AS DECIMAL(18,1)) AS Average
FROM job
INNER JOIN jobMark
ON job.Guid = jobMark.Guid
WHERE job.Jobnumber = @jobnumber
GROUP BY job.Jobnumber
)
SELECT Jobnumber,
CASE
WHEN EXISTS(SELECT * FROM JobAverage) THEN Average
ELSE 0.0 -- This never executes???, i.e. for job records that don't have a mark nothing is returned
END AS Average
FROM JobAverage
)
Я хочу вывести таблицу с номером работы и средним баллом.
Для заданий, у которых есть отметка, все в порядке. То есть среднее значение возвращается вместе с jobnumer.
Для работ, на которых нет отметки, похоже, что это не так. ELSE часть инструкции не выполняется. То есть, я не получаю 0,0 как среднее за работу. Записи не возвращаются. Я что-то упустил?
Извините, я не опытный разработчик SQL, поэтому у меня может быть несколько вопиющих ошибок в приведенном выше коде. Однако я не понимаю, почему это не работает.
Заранее спасибо.