2016-04-23 3 views
0

Ich habe nach den von mir ausgewählten Anweisungen gruppiert, aber es ist fast so, als würde die Datenbank die Gruppenklausel nicht sehen, da sie einen Fehler hervorruft und sagt, dass emp_firstname keine Gruppenfunktion für eine einzige Gruppe ist.Warum wird die Gruppenklausel dieses Codes nicht angewendet?

select emp_firstname, emp_surname, sum(timesheet_hours), sum(payroll_standard*grade_rate), sum((payroll_overtime*grade_rate)*1.5), sum(sum(payroll_standard*grade_rate) + sum((payroll_overtime*grade_rate)*1.5)), sum(payroll_pension) 
from funtom_employee 
join funtom_payroll on emp_id = payroll_emp 
join funtom_timesheet on timesheet_id = payroll_timesheet 
join funtom_grade on emp_grade = grade_id 
where payroll_date between '1-Apr-2014' and '31-Mar-2015' 
group by emp_firstname, emp_surname 
+1

Es gibt verschachtelte SUMs, was versuchen Sie zu erreichen? – dnoeth

+0

Wenn ich eine SUMME (SUM()) versuchte, bekam ich "verschachtelte Gruppenfunktion ohne GROUP BY" –

+0

Ich versuche, die Daten in der SELECT-Anweisung zurückzuziehen und SUM anwenden, um Gesamtwerte für diese Daten zu erhalten. Ich muss nur wissen, warum ich immer noch eine Gruppe Gruppenfunktion Fehler bekommen, obwohl ich nach dem, was ich ausgewählt habe gruppiert habe? –

Antwort

1

Die Verwirrung in der Fehlermeldung tritt auf, weil Oracle verschachtelte Aggregationsfunktion unterstützt. Mit anderen Worten wird dieser (Nicht-Standard) Syntax erlaubt:

SELECT AVG(MAX(salary)) 
FROM employees 
GROUP BY department_id; 

Eine derartige verschachtelte Funktion entspricht:

SELECT AVG(maxsalary) 
FROM (SELECT MAX(salary) as maxsalary 
     FROM employees 
     GROUP BY department_id 
    ) e 

Daher ist die Verschachtelung der sum() s für sich allein kein Fehler - obwohl es in anderen Datenbanken wäre. Das Problem besteht darin, dass Ihre Abfrage Ebenen der Aggregation mischt. Daher wird die seltsame Fehlermeldung, die sich auf die Schlüssel bezieht, anstatt auf die Spalten aggregiert.

Wie in einem Kommentar erwähnt, brauchen Sie nicht verschachtelte Aggregationen:

select emp_firstname, emp_surname, sum(timesheet_hours), 
     sum(payroll_standard*grade_rate), 
     sum((payroll_overtime*grade_rate)*1.5), 
     (sum(payroll_standard*grade_rate) + 
     sum((payroll_overtime*grade_rate)*1.5) 
     ), 
     sum(payroll_pension) 
from funtom_employee join 
    funtom_payroll 
    on emp_id = payroll_emp join 
    funtom_timesheet 
    on timesheet_id = payroll_timesheet join 
    funtom_grade 
    on emp_grade = grade_id 
where payroll_date between '1-Apr-2014' and '31-Mar-2015' 
group by emp_firstname, emp_surname; 

Das heißt, Ihre Version der Abfrage sowieso wahrscheinlich falsch ist. Wenn ein einzelner Mitarbeiter mehrere oder fehlende Zeilen in einer der Tabellen hat, sind die sum() s wahrscheinlich ausgeschaltet. Ich würde zum Beispiel annehmen, dass Sie ein kartesisches Produkt für Arbeitszeittabellen und Gehaltslisten erhalten.

Wenn dies ein Problem ist, und Sie möchten hier helfen, fragen dann andere Frage und Beispieldaten und die gewünschten Ergebnisse umfassen.

Darüber hinaus lernen, Tabellen Aliase zu verwenden und Ihre Spaltennamen zu qualifizieren. Es hilft zu klären, woher die Spalten kommen.

Verwandte Themen