kostenloser Webspace werbefrei: lima-city


SQL group by

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    marius71

    marius71 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    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:
    GROUP_CONCAT
    (MySQL-Handbuch)

    Oder
    MIN / MAX
    , das geht auch bei Strings ;)
    (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
  4. 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
  5. Autor dieses Themas

    marius71

    marius71 hat kostenlosen Webspace.

    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
  6. m**5

    Probier mal DISTINC also etwa so
    SELECT COUNT(DISTINCT(Mitarbeiter-Nummer)),Mitarbeiter-Nummer,Mitarbeiter-Name 
    FROM Verträge GROUP BY Mitarbeiter-Nummer


  7. 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 :-)

  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!