私は自分のプロジェクトでスカラー値関数を使用しないようにしようとしていますので、そのうちの1つをCTEを使ってテーブル値関数に変換しようと決めました。テーブル値関数で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
)
ジョブ数と平均スコアのテーブルです。
マークが付いているジョブの場合はOKと思われます。つまり、平均値が求人情報と共に返されます。
マークが付いていないジョブについては、間違っているようです。ステートメントのELSE部分は実行されません。つまり、私は仕事の平均として0.0を返さない。レコードは返されません。何か不足していますか?
申し訳ありません私は経験豊富なSQL開発者ではありませんので、私は上記のコードでいくつかの目障りな間違いがあるかもしれません。しかし、なぜ私はそれが動作しない混乱しています。
ありがとうございます。
ありがとうございました。どうもありがとう。私はむしろ馬鹿だと感じます。私はすべてのコメントを感謝します。 – bobbo
これはCTEを下回るとうまくいくと思います。 SELECTジョブ番号、実行時(SELECT * FROM JobAverage)THEN(SELECT平均FROMジョブ平均) ELSE 0.0 END AS平均 – bobbo