問題

各仕事に対するコンサルタントの名前と請求金額を求めたい。請求金額は書く労働時間と時給をかけると求められるが、コンサルタントの時給は期間によって変化する。
 Consultants
 emp_id |  emp_name
--------+------------
      1 | Larry
      2 | Moe
      3 | Curly

Billings
 emp_id | bill_date  | bill_rate
--------+------------+-----------
      1 | 1990-01-01 |     25.00
      2 | 1989-01-01 |     15.00
      3 | 1989-01-01 |     20.00     
      1 | 1991-01-01 |     30.00
 
hoursworked
  job_id | emp_id | work_date  | bill_hrs
 --------+--------+------------+--------------------------------
       4 |      1 | 1990-07-01 |     3.00
       4 |      1 | 1990-08-01 |     5.00
       4 |      2 | 1990-07-01 |     2.00
       4 |      1 | 1991-07-01 |     4.00

Consultants:コンサルタントテーブル Emp_id:社員ID  emp_name:社員名
Billings:請求書テーブル  bill_date:請求日    bill_rate:時給
Hoursworked:実働時間テーブル job_id:実働ID work_date:実働日 bill_hrs:実働時間


chiakiの解答

考え方

  • 1つ目のビューで、実働日が請求日より後にある場合の、社員名・請求日・時給・実働日・実働時間を求める。
  • 2つ目のビューで、前に作ったビューを社員名と実働日でグループ化し、社員名・請求日の最大値・実働日を求める。
  • 最後に、上の二つのビューを使って、給料合計を求める。

SQL文

①1つ目のビュー
CREATE VIEW Consultants2 (emp_id, emp_name, bill_date, bill_rate, bill_hrs, work_date)
AS SELECT C.emp_id, C.emp_name, B.bill_date, B.bill_rate, H.bill_hrs, H.work_date
FROM Consultants C, Billings B, HoursWorked H
WHERE H.emp_id = C.emp_id AND H.emp_id = B.emp_id AND H.work_date >= B.bill_date;

 emp_id |  emp_name  | bill_date  | bill_rate | bill_hrs | work_date
--------+------------+------------+-----------+----------+------------
      1 | Larry      | 1990-01-01 |     25.00 |     3.00 | 1990-07-01
      1 | Larry      | 1990-01-01 |     25.00 |     5.00 | 1990-08-01
      1 | Larry      | 1990-01-01 |     25.00 |     4.00 | 1991-07-01
      1 | Larry      | 1991-01-01 |     30.00 |     4.00 | 1991-07-01
      2 | Moe        | 1989-01-01 |     15.00 |     2.00 | 1990-07-01

②2つ目のビュー
CREATE VIEW Consultants3 (name, bd, wd)
AS SELECT C2.emp_name AS NAME, max(C2.bill_date) AS BD, C2.work_date AS WD
FROM Consultants2 C2
GROUP BY C2.emp_name, C2.work_date;

    name    |     bd     |     wd
------------+------------+------------
 Larry      | 1990-01-01 | 1990-07-01
 Larry      | 1990-01-01 | 1990-08-01
 Larry      | 1991-01-01 | 1991-07-01
 Moe        | 1989-01-01 | 1990-07-01

SELECT C2.emp_name, SUM(C2.bill_rate*C2.bill_hrs)
FROM Consultants2 C2, Consultants3 C3
WHERE C2.emp_name = C3.name AND C2.bill_date = C3.bd AND C2.work_date = C3.wd
GROUP BY C2.emp_name;

結果

  emp_name  |   sum
------------+----------
 Larry      | 320.0000
 Moe        |  30.0000
(2 行)

satomiの解答

考え方

  • 副問い合わせで、実働日以前の直近の請求日を選ぶ
  • emp_nameでグループ化し、該当する請求日の時給と、実働時間をかけた合計を求める。

SQL文

select c.emp_name,sum(h.bill_hrs*b.bill_rate)
from consultants c,billings b,hoursworked h
where c.emp_id=b.emp_id
and c.emp_id=h.emp_id
and b.bill_date=(select max(b1.bill_date)
from billings b1,hoursworked h1
        where h.work_date>b1.bill_date
and b1.emp_id=h1.emp_id
        and h1.emp_id=h.emp_id
        group by h1.emp_id)
group by c.emp_name;

結果

 emp_name  |   sum
 ------------+----------------------
  Moe      |  30.0000
 Larry     | 320.0000
最終更新:2008年06月04日 17:44