SQL group by
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
code
datenbank
datensatz
donnerstag
funktion
getestet code
handbuch
http
mitarbeiter
montag
mustermann
nummer
ordern
sonntag
tabelle
url
vergangenheit
verkettung
wochentag
-
Hallo, ich suche eine Möglichkeit über einen einfachen SELECT Befehl die Anzahl aller Verträge gruppiert nach Mitarbeiter Nummer und Name zu selektieren.
In etwa so:
SELECT count(*) ,Mitarbeiter-Nummer,Mitarbeiter-Name
FROM Verträge
GROUP BY Mitarbeiter-Nummer,Mitarbeiter-Name
Das Problem ist aber, das in der Datenbank mehrere Einträge mit dem gleichem Mitarbeiter vorhanden sind. Jeder Datensatz weist aber einen anderen namen auf. In Datensatz 1 heißt er bsp. Peter Mustermann und in Datensatz 2 heißt er Peter M. In allen Datensätzen hat er allerdings eine identische Nummer
(Ich weiß, der Aufbau der Datenbank ist so nicht korrekt (Normalisierung) aber da kann ich als außenstehender nichts dran ändern, da hat halt jemand in der vergangenheit mist gebaut)
Nun bekomme ich folgende Ausgabe
Anzahl 40 Nummer 140 Name Peter Mustermann
Anzahl 10 Nummer 140 Name Peter M.
Ich möchte aber folgendes
Anzahl 50 Nummer 140 Name Peter Mustermann
Gibt es hierzu irgendwelche Funktionen/Operanten, bei denen beispielsweise nur 1 Name, oder von mir aus auch eine verkettung aller Namen angezeigt wird? Ähnlich wie Sum,Max oä. bei Integer Werten -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Gibt es hierzu irgendwelche Funktionen/Operanten, bei denen beispielsweise nur 1 Name, oder von mir aus auch eine verkettung aller Namen angezeigt wird? Ähnlich wie Sum,Max oä. bei Integer Werten
Verkettung aller Namen:
(MySQL-Handbuch)GROUP_CONCAT
Oder
, das geht auch bei Strings ;)MIN / MAX
(MySQL-Handbuch)
Beispiel:
SELECT COUNT(*) ,Mitarbeiter-Nummer,GROUP_CONCAT(Mitarbeiter-Name SEPARATOR ', ') AS Mitarbeiter-Name FROM Vertraege GROUP BY Mitarbeiter-Nummer
Beitrag zuletzt geändert: 29.1.2012 23:58:32 von thomasba -
Ich denke folgendes könnte dir helfen:
$sql="SELECT *, CONCAT( CASE DATE_FORMAT(Zeit,'%w') WHEN 0 THEN 'Sonntag' WHEN 1 THEN 'Montag' WHEN 2 THEN 'Dienstag' WHEN 3 THEN 'Mittwoch' WHEN 4 THEN 'Donnerstag' WHEN 5 THEN 'Freitag' WHEN 6 THEN 'Samstag' ELSE 'Wochentag' END, ', den ', DATE_FORMAT(Zeit,'%d.%m.%Y') ) as AusgabeZeit from tabelle
Hatte mir vor kurzem diese Möglichkeit ergooglet, um komplette Wochentage in Deutsch über das Datum auszugeben.
Ich denke so in etwa kann man es umbauen (nicht getestet):
SELECT *, CONCAT( CASE Mitarbeiter-Nummer WHEN 140 THEN 'Peter Mustermann' WHEN 1337 THEN 'copynpaste' ELSE 'Kein Name' END ) as MitarbeiterName from Verträge
Wenn ich richtig denke, könnte es funktionieren, ansonsten mal das CONCAT rausnehmen.
Edit: Schade war zu langsam, und scheint ja bessere Möglichkeit zu geben.
Beitrag zuletzt geändert: 29.1.2012 23:55:42 von copynpaste -
Hallo,
habe grad noch eine andere Möglichkeit gefunden, euro Vorschläge sind aber auch super, danke dafür.
Hier meine Möglichkeit
SELECT V.Vertrag, Mi.Nummer as Mitarbeiternummer, (SELECT TOP (1) Maa.name1 FROM Mitarbeiter as Maa WHERE Maa.nummer=Mi.Nummer order by maa.name1) .....
Beitrag zuletzt geändert: 30.1.2012 0:00:06 von marius71 -
Probier mal DISTINC also etwa so
SELECT COUNT(DISTINCT(Mitarbeiter-Nummer)),Mitarbeiter-Nummer,Mitarbeiter-Name FROM Verträge GROUP BY Mitarbeiter-Nummer
-
Ich gehe mal davon aus, dass die Mitarbeiter-Nr nur einem Mitarbeiter zugeordnet ist, nur wurden verschiedene namen eingetragen.
Lass den Mitarbeitername in der group by klausel einfach weg.
Deine Mitarbeiternr sollte der primary key sein oder zumindest eindeutig. also wenn du nach der Mitarbeiternr gruppierst und zählst, zählst du wirklich wie oft der Mitarbeiter in der Tabelle vorkommt.
Wenn du jetzt den Namen mit ausgegeben bekommen willst, bin ich mir jetzt nicht sicher wie einfach das zu lösen ist.
1. Lösungsvorschlag (nur Mitarbeiternr ausgeben)
SELECT count(*) ,Mitarbeiter-Nummer FROM Verträge GROUP BY Mitarbeiter-Nummer
2.Lösungsvorschlag (versuchen den Namen mit auszugeben, weiss nicht ob das funktioniert wegen der mehrdeutigkeit, denke eher nicht, aber versuchs einfach mal)
SELECT count(*) ,Mitarbeiter-Nummer,Mitarbeiter-Name FROM Verträge GROUP BY Mitarbeiter-Nummer
3. Lösungsvorschlag(die ErgebnisTabelle aus Lösungsvorschlag 1 mit einer Tabelle die jede Nr einmal hat und einen Namen dazu joinen. Bin ich mir aber auch nicht sicher ob das mit distinct so funktioniert, dass er einfach den ersten namen nehmen würde der in der tabelle vorkommt)
SELECT count(*) ,Mitarbeiter-Nummer FROM Verträge GROUP BY Mitarbeiter-Nummer LEFT JOIN (SELECT DISTINCT Mitarbeiter-Nummer AS nr,Mitarbeiter-Name AS name FROM Verträge) ON Mitarbeiter-Nummer=nr
Berichte mal obs geklappt hat :-)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage