上記のように、CASE ステートメントを使用して virtual を決定する必要があるため、これは非常に面倒ですemployee_id
。この CASE ステートメントを udf にリファクタリングするか、結果をテーブルに格納することができれば、はるかに簡単になります。
これが何をしようとしているのかを明確にするためにemployee
、各従業員のカウントを含むテーブルにテーブルを結合したいと考えています。カウント テーブルは次のようになります。
SELECT employee_id, COUNT(*) AS employee_count
FROM employee
GROUP BY employee_id
それらを結合すると、次のようになります。
SELECT ...
FROM employee
JOIN (SELECT employee_id, COUNT(*) AS employee_count
FROM employee
GROUP BY employee_id) ec
ON employee.employee_id = ec.employee_id
計算された給与は次のようになります。
CASE
WHEN ec.employee_count > 1
THEN CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2))
ELSE total_salary
END AS salary,
そして、「employee_id」の代わりに巨大な CASE ステートメントを置き換えた完全なクエリを次に示します。
SELECT
CASE employee.employee_id
WHEN ''
THEN RTRIM(last_name) + '_' + RTRIM(first_name)
+ '_' + RTRIM(gender) + '_'
+ RTRIM(race_ethnicity_code) + '_'
+ RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_'
+ RTRIM(assignment_code)
ELSE employee.employee_id
END AS emp_id,
last_name, first_name,
assign_perc,
assignment_num,
CASE
WHEN ec.employee_count > 1
THEN CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2))
ELSE total_salary
END AS salary,
total_salary
FROM employee
JOIN (SELECT CASE employee.employee_id
WHEN ''
THEN RTRIM(last_name) + '_' + RTRIM(first_name)
+ '_' + RTRIM(gender) + '_'
+ RTRIM(race_ethnicity_code) + '_'
+ RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_'
+ RTRIM(assignment_code)
ELSE employee.employee_id
END AS employee_id, COUNT(*) employee_count
FROM employee
GROUP BY CASE employee.employee_id
WHEN ''
THEN RTRIM(last_name) + '_' + RTRIM(first_name)
+ '_' + RTRIM(gender) + '_'
+ RTRIM(race_ethnicity_code) + '_'
+ RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_'
+ RTRIM(assignment_code)
ELSE employee.employee_id
END) ec
ON CASE employee.employee_id
WHEN ''
THEN RTRIM(last_name) + '_' + RTRIM(first_name)
+ '_' + RTRIM(gender) + '_'
+ RTRIM(race_ethnicity_code) + '_'
+ RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_'
+ RTRIM(assignment_code)
ELSE employee.employee_id
END = ec.employee_id
ORDER BY last_name, first_name, district_name