Ich habe eine Employee-Tabelle mit Gehalt. Ich möchte Gehalt - Durchschn. (Gehalt) für jeden Mitarbeiter auflisten. Kann mir bitte jemand bei der SQL Abfrage helfen.Anwenden von Aggregatfunktionen Für alle Spalten
Antwort
Sie können dies mit Fensterfunktionen tun:
select e.*,
(salary - avg(salary) over()) as diff
from employees e;
Sie könnten einen Inline-View verwenden, um eine einzelne Zeile mit dem durchschnittlichen Gehalt zurückzukehren. und verbinden Sie diese Zeile zurück mit der Mitarbeiter-Tabelle.
Etwas wie folgt aus:
SELECT e.emp_id
, e.salary
, e.salary - a.avg_salary
FROM employee e
CROSS
JOIN (SELECT AVG(t.salary) AS avg_salary
FROM employee t
) a
ORDER BY e.emp_id
Nur ein paar andere Variationen; die anderen, die bereits gepostet wurden, sollten dem Zweck ziemlich gut dienen - vorausgesetzt, wir haben alle die gewünschte Ausgabe richtig erkannt, weder DDL noch Beispieldaten noch die erwartete Ausgabe von den gegebenen Eingaben.
Wenn es nicht erforderlich ist, das gemittelte Gehalt [als Durchschnitt über alle Zeilen] zusätzlich zu der berechneten Differenz einzubeziehen, verwendet das folgende [mit optionalem Umwandeln in ein Dezimalergebnis] einen skalaren Subselect, um das zu erhalten Wert von jedem Mitarbeiter Gehalt abzuziehen:
select emp.*
, dec(salary - (select avg(salary)
from employee_table)
, 11, 0) as saldif
from employee_table as emp
Oder die gemittelten Gehälter sowohl in der Differenz und als Säule für sich zu verwenden, dann wieder die skalare subselect, aber für die seitliche Referenz in dem [explizit joined- zur Verfügung gestellt zu] Unterabfrage; wieder, optional Casting für Dezimalergebnisse:
select x.*
from table
(select avg(salary)
from employee_table
) as a (avgsal)
cross join lateral
(select emp.*
, dec(salary - avgsal , 11) as saldif
, dec(avgsal , 11) as salavg
from employee_table as emp
) as x
andere Lösung;)
with avgsalary as (
select avg(salary) avgsal from employee_table
)
select emp.*, case when emp.salary is null then cast(null as decimal) else round(emp.salary - avgs.avgsal, 2) end as diffsal, avgs.avgsal
from employee_table as emp cross join avgsalary avgs
Und noch eine andere Variante:
with EmpAvg (avgSalary)
as (SELECT avg(salary) from employee_table)
select e.*, a.avgSalary,
(e.salary - a.avgSalary) as diffAvg
from employee_table e cross join EmpAvg a
Es kann viele Formen von Abfragen, die zu vergleichbaren Ergebnissen führen kann . (Obwohl ich aufgehört habe, die berechneten Werte zu werfen, also nicht genau gleiche Ergebniswerte.)
- 1. verschiedene Aggregatfunktionen anwenden, wenn pivot_table
- 2. SparkSQL: anwenden Aggregatfunktionen auf eine Liste der Spalte
- 3. Anwenden von to_datetime auf alle Spalten außer Index
- 4. Ausgabe von mehreren Aggregatfunktionen als Zeilen anstelle von Spalten
- 5. Anwenden von Funktionen, Datenrahmen Spalten
- 6. Generisches Expression.Call für Aggregatfunktionen
- 7. Aggregatfunktionen
- 8. Anwenden von Pandas to_datetime auf alle Datumsspalten
- 9. Anwenden einer eindeutigen Klasse für mehrere Spalten
- 10. konvertieren Zeilen in Spalten ohne PIVOT mit oder Verrohrte Aggregatfunktionen
- 11. Anwenden von Funktionen auf Spalten nach Gruppe
- 12. Druid-Aggregatfunktionen
- 13. Anwenden von gsub auf verschiedene Spalten
- 14. Anwenden von Funktion auf Datenrahmen Spalten
- 15. Anwenden von Lambda-Funktionen auf Spalten
- 16. Oracle Spaltenbreite für alle Spalten
- 17. Aggregatfunktionen mit EF-Repository
- 18. Wie IgnoreNulls Flag für erste Funktion in agg mit Zuordnung von Spalten und Aggregatfunktionen festlegen?
- 19. Implementieren Suchfilter für alle Spalten
- 20. Alle Transformationsmatrizen anwenden
- 21. MongoDB Aggregatfunktionen
- 22. R Anwenden() - Funktion auf bestimmten Datenframe-Spalten
- 23. Anwenden von Pandas groupby für jeden Index
- 24. Hive Aggregatfunktionen funktionieren nicht
- 25. Wie für Aggregatfunktionen in XML umgewandelt
- 26. Pyspark Dataframe Funktion auf zwei Spalten anwenden
- 27. Anwenden einer Berechnung auf mehrere Spalten
- 28. Wie gilt summarise_each für alle Spalten außer einer?
- 29. Aggregatfunktionen über Arrays
- 30. Schienen 3 Aggregatfunktionen mit Zeitstempeln