2017-05-12 1 views
0

Ich habe die folgenden Tabellen bereits in meiner DBCompute „Betrag“ unter Verwendung von Werten aus den Tabellen

EMP 
    E_N E_NAM  E_RATE E_DEP 
    --- ----- ---------- ----- 
    1 A   400  
    2 B   200 1  
    3 C   150 2  
    4 D   150 3  
    5 E   120 1  
    6 F   100 1  
    7 G   100 2  
    8 H    50 2  
    9 I    50 3  
    10 J    50 3  
    11 K   150 3 


WORKS 
    E_NO PR_NO  HRS 
    --- --- ---------- 
    2  1   10 
    3  2   20 
    5  1   20 
    5  2   20 
    5  3   20 
    6  1   10 
    6  2   10 

Ich habe den Betrag für jedes Projekt als Rechnungsbetrag zu berechnen, und das ist die Summe des Rechnungsbetrages zu das Projekt von allen Mitarbeitern, die an dem Projekt arbeiten. Der berechnete Betrag ist E_RATE * HRS (Produkt von HRS und E_RATE).

Es gibt nur 3 PR_NO: 1, 2 und 3.

ich diese mehrmals ohne Erfolg versucht haben, ich weiß, dass es eine verschachtelte Abfrage und die Berechnung sein muss AS AMOUNT gezeigt werden, aber keine Ahnung, wie man die 3 Projekte nur mit der bereits durchgeführten Berechnung anzeigen kann.

Antwort

0

Klingt einfach verbinden und Aggregation:

select w.pr_no, 
    sum(w.hrs * e.e_rate) as amount 
from works w 
join emp e on w.e_no = e.e_n 
group by w.pr_no; 
+0

Es schön dank gearbeitet, aber ich wünschte wirklich, die Arbeit hinter dieser Abfrage zu verstehen . Was genau macht die vierte Zeile? Es werden alle Werte aus der Tabelle EMP, die sich nicht in der Tabelle WORK befinden, gelöscht. – John

+0

@John verbindet die beiden Tabellen basierend auf der Mitarbeiter-ID. So erhalten wir den Preis für einen bestimmten Mitarbeiter in einem Projekt. Welche wir verwenden können, um den Gesamtbetrag zu finden. Wenn Sie wissen möchten, wie Joins funktionieren, suchen Sie online nach Anleitungen. Es gibt viele Ressourcen zur Verfügung – GurV

+0

Oh ich bekomme es, also ist es wie wenn Sie (visuell gesprochen) Sie die zusätzlichen Spalten von WORK in EMP hinzugefügt, aber nur diejenigen E_NO, die in WORK sind verwendet werden, die andere verworfen. Dann berechnet es die Menge. Klingt das richtig? – John

0

einfaches Aggregat SUM() Funktion und die Tabellen verknüpfen

--test data 
    with EMP(e_no, e_name, e_rate, e_dep) as 
    (select  1, 'A',   400, null from dual union all  
    select  2, 'B',   200, 1 from dual union all 
    select  3, 'C',   150, 2  from dual union all 
    select  4, 'D',   150, 3  from dual union all 
    select  5, 'E',   120, 1  from dual union all 
    select  6, 'F',   100, 1  from dual union all 
    select  7, 'G',   100, 2  from dual union all 
    select  8, 'H',    50, 2  from dual union all 
    select  9, 'I',    50, 3  from dual union all 
    select  10, 'J',    50, 3  from dual union all 
    select  11, 'K',   150, 3 from dual), 
    WORKS(e_no, pr_no, hrs) as 
    (select 2,  1,   10 from dual union all 
    select 3,  2,   20 from dual union all 
    select 5,  1,   20 from dual union all 
    select 5,  2,   20 from dual union all 
    select 5,  3,   20 from dual union all 
    select 6,  1,   10 from dual union all 
    select 6,  2,   10 from dual) 
    -- actual query starts here 
    select w.pr_no, sum(w.hrs*e.e_rate) as amount 
    from works w 
    inner join emp e on (w.e_no = e.e_no) 
    group by w.pr_no; 


    "PR_NO"|"AMOUNT" 
    1|5400 
    2|6400 
    3|2400 
+0

Wie ist Ihre Antwort anders als meins? – GurV

+0

Vielen Dank, aber wie ich Gurwinder Singh gesagt habe, möchte ich das Konzept dahinter verstehen, also benutze inner join nur Werte die in beiden Tabellen vorkommen (w.e_no = e.e_no)? – John

+0

Ich glaube nicht, dass es wirklich anders ist. Du hast mich einfach dazu geschlagen. – unleashed

Verwandte Themen