2017-01-26 5 views
0

Ich habe eine Tabelle in MS-Zugang mit 2 Feldern (Gehaltsabrechnung und Abwesenheitsgrund). Es gibt einen Datensatz pro Abwesenheitsinstanz.Erhalten maximale Anzahl von jeder Gruppe

Ich versuche, eine SQL-Abfrage zu schreiben, um den häufigsten Abwesenheitsgrund für jede Person zurückzugeben. Ich bin mir sicher, dass es einen einfachen Weg dafür gibt, aber ich kann es nicht ganz verstehen. Ich habe versucht, die folgende Abfrage zu schreiben:

SELECT payroll, reason, max(count) 
FROM 
(
SELECT payroll, reason, count(reason) as count 
FROM table1 
GROUP BY payroll, reason 
) 
GROUP BY payroll, reason 

aber dies gibt jeden Grund für jede Person zurück. Wenn ich den Grund aus der GROUP BY-Klausel entferne, funktioniert es nicht, da ich den Grund im Auswahlteil nicht zusammengefasst habe. Kann jemand darauf hinweisen, wo ich falsch liege?

Dank

Antwort

1

Ein Verfahren verwendet having:

SELECT payroll, reason, count(reason) as count 
FROM table1 as t1 
GROUP BY reason, payroll 
HAVING t1.reason = (SELECT TOP 1 tt1.reason 
        FROM table1 as tt1 
        WHERE tt1.payroll = t1.payroll 
        GROUP BY tt1.reason 
        ORDER BY COUNT(*) DESC, tt1.reason 
        ); 
+0

Dies funktioniert gut danke! Ich musste nur den ersten Alias ​​in t1 ändern. – Leroy

+0

Weißt du, wie ich das optimieren könnte, so dass, wenn jemand mehr als einen Hauptgrund hat (zB 1 von jedem), er den letzten zurückgibt (es gibt ein favourtDate Feld in der Tabelle)? Danke – Leroy

+1

Es ist in Ordnung. Ich hab es geschafft. Ich habe absenceDate in die GROUP BY-Klausel der Unterabfrage aufgenommen und dann in die ORDER BY-Klausel anstelle von reason eingefügt. – Leroy

Verwandte Themen