0

SQL Server で作業している以下のクエリに問題があります。

SELECT  
        emp_id= CASE 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_id
            END , 
        last_name, first_name, 
        assign_perc, 
            assignment_num,
        CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2)) AS salary,
        total_salary
FROM employee 
ORDER BY last_name, first_name, district_name

私のスクリプトは列の単純な抽出であり、null の場合に emp_id の case ステートメントを介して一意のキーを作成します。私が抱えている問題は、その人が複数の割り当てを持っているときに assign_perc を total_Salary で乗算し、その営業担当者が一度だけリストされているときに最大給与を取るときです。例-私の期待される結果:

ここに画像の説明を入力

ジョン・スミスはパートタイムの労働者で、1 つの割り当てが 1 回しかリストされないため、彼の assign_perc は 1 未満になりますが、総合計 (assign_perc*total_salary) ではなく最大給与が必要です。ご協力ありがとうございました。

4

1 に答える 1

1

上記のように、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
于 2013-04-18T15:41:27.093 に答える