2017-05-04 4 views
1

hier Mein Problem ist, dass ich zwei Tabellen haben,Wie kann ich die SUMME einer Variablen aus einer Reihe von ID-Nummern erhalten? PLSQL

SQL> select * from paydata1; 

IDNO NAME      J  SALARY  PAYHR 
---- ------------------------- - ---------- ---------- 
1111 Ann French    S  75000   0 
2222 Robert Costa    H   0   45 
3333 Linda Ames    H   0   50 
4444 Scott Brooks    S  78000   0 
5555 Susan Ash     S  57000   0 
6666 James Smith    S  55000   0 
7777 Mary Jones    H   0   36 
8888 John Morse    H   0   39 

und

SQL> select * from paytran1; 

IDNO PRO HOURSWK 
---- --- ---------- 
1111 123   20 
1111 456   10 
1111 789   15 
2222 123   17 
2222 456   24 
2222 789   20 
3333 123   20 
3333 789   20 
4444 123   10 
4444 456   28 
4444 789   5 

IDNO PRO HOURSWK 
---- --- ---------- 
5555 456   40 
6666 456   44 
7777 456   30 
7777 789   15 
8888 123   10 
8888 456   25 
8888 789   5 

MY PL/SQL-Code hier:

SET SERVEROUTPUT ON 
DECLARE 
     v_idno paydata1.idno%TYPE; 
     v_name paydata1.name%TYPE; 
     v_jcode paydata1.jobcode%TYPE; 
     v_sal paydata1.salary%TYPE; 
     v_payh paydata1.payhr%TYPE; 
     v_hrsw paytran1.hourswk%TYPE; 
     CURSOR curse IS 
       SELECT paydata1.idno, name, jobcode, salary, payhr, hourswk 
       FROM paydata1, paytran1; 
BEGIN 
OPEN curse; 
FETCH curse INTO v_idno, v_name, v_jcode, v_sal, v_payh, v_hrsw; 
WHILE curse%ROWCOUNT < 9 AND curse%FOUND LOOP 
     IF v_jcode = 'S' THEN 
       v_sal := v_sal/52; 
       DBMS_OUTPUT.PUT_LINE(v_name || ': weekly salary is ' || v_sal); 

     ELSE 
       v_hrsw := sum(payhr) 
       v_sal := v_payh * v_hrsw; 
       DBMS_OUTPUT.PUT_LINE(v_name || ': overall pay is ' || v_sal); 
     END IF; 
    FETCH curse INTO v_idno, v_name, v_jcode, v_sal, v_payh, v_hrsw; 
END LOOP; 
CLOSE curse; 
END; 
/

SET SERVEROUTPUT OFF 

Ich muss in der Lage sein teilen Sie die Angestellten, wo sie angestellt sind, und finden Sie die Bezahlung pro Stunde multipliziert mit Stunden gearbeitet (aus der zweiten Tabelle) Mein Problem ist, dass in der zweiten Tabelle, die Stunden gearbeitet sind in mehrere Abschnitte aufgeteilt. Wie kann ich die Summe der geleisteten Stunden erhalten, damit ich sie in meine Variable 'v_hrsw' einfügen kann?

Im Moment ist es nur die erste Nummer, die es in paytran1.hourswk findet, um es als v_hrsw zu verwenden.

Vielen Dank für jede Hilfe.

EDIT:

Ergebnis sieht wie folgt aus derzeit ...

Ann French: weekly salary is 1442.31 
Robert Costa: overall pay is 900 
Linda Ames: overall pay is 1000 
Scott Brooks: weekly salary is 1500 
Susan Ash: weekly salary is 1096.15 
James Smith: weekly salary is 1057.69 
Mary Jones: overall pay is 720 
John Morse: overall pay is 780 

Aber jemand mit "Gesamtvergütung" hat eine falsche Gesamt.

+0

ändern Was Ihre erwartete Ausgabe auf 2 Tabellen basiert? – Utsav

+0

Sorry, ich habe die Ausgabe hinzugefügt. –

Antwort

1

Verwenden Sie diese Abfrage direkt, um Ihre Ausgabe zu erhalten.

select 
     d.name||(case when d.j='S' then ': Weekly salary is ' 
      when d.j='H' then ': overall pay is ' 
     end)||(case when d.J='S' then d.salary/52 
      when d.j='H' then sum(t.hourswk)*d.payhr 
     end) as output 
    from 
    paydata1 d inner join paytran1 t 
    on d.idno=t.idno 
    group by d.idno ,d.name,d.J,d.salary,d.payhr; 

So können Sie Ihre PL/SQL-Code

declare 
cursor curse is 
    select 
     d.name||(case when d.j='S' then ': Weekly salary is ' 
      when d.j='H' then ': overall pay is ' 
     end)||(case when d.J='S' then d.salary/52 
      when d.j='H' then sum(t.hourswk)*d.payhr 
     end) as output 
    from 
    paydata1 d inner join paytran1 t 
    on d.idno=t.idno 
    group by d.idno ,d.name,d.J,d.salary,d.payhr; 
    begin 
    for c1 in curse 
    loop 
    DBMS_OUTPUT.PUT_LINE(c1.output); 
end loop; 
end; 
+0

Ich entschuldige mich, ich hätte klarer sein sollen. Ich muss hier PL/SQL-Code verwenden, damit ich es mehrmals ausführen kann. –

+0

Sie können diese Abfrage in PL/SQL-Code als Cursor und drucken Sie die Ausgabe – Utsav

+0

Ich bearbeitete die Antwort und fügte den PLSQL-Block mit der Abfrage, die ich gab. Es wäre einfacher, es so zu machen. – Utsav

Verwandte Themen