-2

2012 年の各月の従業員の個別の給与を取得したいと考えています。コードは次のとおりです。

SELECT 
jd.job_grade,
e.employee_title||'. '|| e.first_name||' '||e.initials||' '||e.surname as FULLNAME,
e.employee_code,
sum(NVL(jan.amount,0)) as JAN_PAY,
sum(NVL(feb.amount,0)) as FEB_PAY,
sum(NVL(mar.amount,0)) as MAR_PAY,
sum(NVL(apr.amount,0)) as APR_PAY,
sum(NVL(may.amount,0)) as MAY_PAY,
sum(NVL(jun.amount,0)) as JUN_PAY,
sum(NVL(jul.amount,0)) as JUL_PAY,
sum(NVL(aug.amount,0)) as AUG_PAY,
sum(NVL(sep.amount,0)) as SEP_PAY,
sum(NVL(oct.amount,0)) as OCT_PAY,
sum(NVL(nov.amount,0)) as NOV_PAY,
sum(NVL(ar.amount,0)) as DEC_PAY/*,
0.05*sum(NVL(ar.amount,0)) as Bonus*/ 
from (((((((((((((tbl_actual_run ar
JOIN tbl_actual_run JAN ON jan.emp_code=ar.emp_code)
JOIN tbl_actual_run FEB ON feb.emp_code=ar.emp_code)
JOIN tbl_actual_run MAR ON mar.emp_code=ar.emp_code)
JOIN tbl_actual_run APR ON apr.emp_code=ar.emp_code)
JOIN tbl_actual_run MAY ON may.emp_code=ar.emp_code)
JOIN tbl_actual_run JUN ON jun.emp_code=ar.emp_code) 
JOIN tbl_actual_run JUL ON jul.emp_code=ar.emp_code)
JOIN tbl_actual_run AUG ON aug.emp_code=ar.emp_code)
JOIN tbl_actual_run SEP ON sep.emp_code=ar.emp_code)
JOIN tbl_actual_run OCT ON oct.emp_code=ar.emp_code)
JOIN tbl_actual_run NOV ON nov.emp_code=ar.emp_code) 
JOIN TBL_EMPLOYEE E ON E.EMPLOYEE_CODE=ar.emp_code) 
JOIN tbl_job_details jd ON jd.employee_code=ar.emp_code) 
where (ar.payroll_date LIKE '%DEC-12%' and ar.ed_code in ('0001','0011','0012','0003')) 
and  (nov.Payroll_Date LIKE'%NOV-12%'and nov.ed_code in ('0001','0011','0012','0003'))
and (oct.Payroll_Date LIKE'%OCT-12%' and oct.ed_code in ('0001','0011','0012','0003'))
and (sep.Payroll_Date LIKE'%SEP-12%' and oct.ed_code in ('0001','0011','0012','0003'))
and (aug.Payroll_Date LIKE'%AUG-12%' and aug.ed_code in ('0001','0011','0012','0003'))
and (jul.Payroll_Date LIKE'%JUL-12%' and jul.ed_code in ('0001','0011','0012','0003'))
and (jun.Payroll_Date LIKE'%JUN-12%' and jun.ed_code in ('0001','0011','0012','0003'))
and (may.Payroll_Date LIKE'%MAY-12%' and may.ed_code in ('0001','0011','0012','0003'))
and (apr.Payroll_Date LIKE'%APR-12%' and apr.ed_code in ('0001','0011','0012','0003'))
and (mar.Payroll_Date LIKE'%MAR-12%' and mar.ed_code in ('0001','0011','0012','0003'))
and (feb.Payroll_Date LIKE'%FEB-12%' and feb.ed_code in ('0001','0011','0012','0003'))
and (jan.Payroll_Date LIKE'%JAN-12%' and jan.ed_code in ('0001','0011','0012','0003'))
GROUP BY jd.job_grade,e.employee_title,e.first_name,e.initials,e.surname,e.employee_code 
order by TO_NUMBER(jd.job_grade) DESC, e.first_name,e.surname

問題は

  1. 数字は累積であり、各月の各個人がどのように受け取ったかを反映していません.
  2. 年内に雇用または解雇された個人が現れていない

ノート:

  • TBL_ACTUAL_RUN は、すべての月給が保持される場所です
  • TBL_Employee は、すべての従業員が保持される場所です
  • TBL_JOB_Details は、従業員のジョブ情報が保持される場所です

誰でも手伝ってもらえますか? あなたの援助は大歓迎です

4

1 に答える 1

1

これはコメントには長すぎるので、これを回答として投稿します。これらすべての結合を使用してクエリをデバッグするのは難しいと思います。これは、すべての結合なしでデバッグしやすいバージョンです。CASEこれは、毎月決定するステートメントで集計を使用していることを除いて、同じことを行っています。構文は次のようになります。

SELECT jd.job_grade,
  e.employee_title||'. '|| e.first_name||' '||e.initials||' '||e.surname as FULLNAME,
  e.employee_code,
  sum(case when ar.payroll_date LIKE '%JAN-12%' then ar.amount else 0 end) JAN_PAY,
  sum(case when ar.payroll_date LIKE '%FEB-12%' then ar.amount else 0 end) FEB_PAY,
  sum(case when ar.payroll_date LIKE '%MAR-12%' then ar.amount else 0 end) MAR_PAY,
  sum(case when ar.payroll_date LIKE '%APR-12%' then ar.amount else 0 end) APR_PAY,
  sum(case when ar.payroll_date LIKE '%MAY-12%' then ar.amount else 0 end) MAY_PAY,
  sum(case when ar.payroll_date LIKE '%JUN-12%' then ar.amount else 0 end) JUN_PAY,
  sum(case when ar.payroll_date LIKE '%JUL-12%' then ar.amount else 0 end) JUL_PAY,
  sum(case when ar.payroll_date LIKE '%AUG-12%' then ar.amount else 0 end) AUG_PAY,
  sum(case when ar.payroll_date LIKE '%SEP-12%' then ar.amount else 0 end) SEP_PAY,
  sum(case when ar.payroll_date LIKE '%OCT-12%' then ar.amount else 0 end) OCT_PAY,
  sum(case when ar.payroll_date LIKE '%NOV-12%' then ar.amount else 0 end) NOV_PAY,
  sum(case when ar.payroll_date LIKE '%DEC-12%' then ar.amount else 0 end) DEC_PAY
from tbl_actual_run ar
left join TBL_EMPLOYEE E 
  ON E.EMPLOYEE_CODE=ar.emp_code 
left JOIN tbl_job_details jd 
  ON jd.employee_code=ar.emp_code) 
where ar.payroll_date LIKE '%-12%' 
  and ar.ed_code in ('0001','0011','0012','0003')
group by jd.job_grade,e.employee_title,e.first_name,e.initials,e.surname,e.employee_code
order by TO_NUMBER(jd.job_grade) DESC, e.first_name,e.surname
于 2012-12-18T12:04:56.793 に答える