0

私は2つのテーブルEmployeeとを結合していWagesます。これで、従業員はさまざまなプロジェクトで作業できるため、複数の賃金を受け取ることができます。私は彼の賃金の合計が必要です。という列もありますEmployee_benefits_Claimed_Ind。これは、従業員が各プロジェクトで何らかの利益を主張したかどうかを示す指標です。彼はいくつかのプロジェクトの利益を主張することができ、いくつかのプロジェクトの利益を主張することはできませんが、私が懸念している限り、彼が資格のない1つのプロジェクトでも利益を主張する場合。これが私が入力しようとしているテーブルです:

CREATE TABLE EMPLOYEE_QUAL
(Employee_id NUMBER,
 TOTAL_WAGES NUMBER,
EMPLOYEE_disQUALIFY CHAR(1))


INSERT INTO EMPLOYEE_QUAL(Employee_id, Total_wages, EMployee_disQualify)
SELECT      c_Employee_id,
            c_Total_wages,
            c_Employee_disQualify
FROM        (
                Select  Employee_ID as c_Employee_id
                from    Employees
            ) e
LEFT JOIN   (
                Select      SUM(Wages),
                            Employee_disQualify
                from        wages
                group by    Employee_disQualify
            ) w on e.employee_id = w.employee_id

ただし、従業員が一方の利益を主張し、もう一方の利益を主張しない場合、。のため、これには2つのエントリしかありませんGROUP BY。理想的には、Employee_disqualify_indが「Y」であるエントリは1つだけである必要があります。これは、彼が1つのプロジェクトで利益を主張しているためです。彼がもう一方にいなかったかどうかは関係ありません。これを達成するにはどうすればよいですか?

4

1 に答える 1

2

私はあなたが本当に言っていることを推測するつもりです。

英語:で指定されたすべての従業員について、テーブルEmployees.Employee_IDの賃金を合計し、wages.Employee_disqualify`フラグをYesに設定します。WAGESEMployee_disQualify' = 'Y' if any of the

SQLでは、次のようになります。

SELECT e.Employee_ID,
       sum(w.wages),
       case when 
          (sum (case w.Employee_disQualify WHEN 'Y' THEN 1 else 0 end)) > 0
              THEN 'Y'
              ELSE 'N'
       end
FROM Employees e
LEFT JOIN wages w 
   on e.employee_id = w.employee_id
group by e.employee_ID

(選択を示したところです)。

主なトリックは、employee_disqualifyフラグを(を使用して)数値に変換してCASE簡単に集計できるようにし、この集計の結果をYまたはN w/anotherに変換することCASEです。一致する行のいずれかに少なくとも1つのYがある場合、合計は> 1になるため、最終結果としてYが得られます。それ以外の場合は、N。(そして、あなたのフィールドがどのように設定されているかについても推測しています。)

集計していなかった場合は、インラインselect 'Y' where exists . .タイプの手掛かりを使用して行う可能性がありますが、とにかくすでに集計しており、これはテーブル全体sum(wages)の同じスキャンで計算されるため、これはかなり効率的です。wages

たとえば、ここを参照してください: http ://sqlfiddle.com/#!4/67691/2

于 2012-04-27T16:02:54.137 に答える