Announcement

Collapse
No announcement yet.

Nur die Daten anzeigen, welche nur 1 Chef haben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Nur die Daten anzeigen, welche nur 1 Chef haben

    Hallo Leute,

    ich habe eine Mitarbeitertabeller, welche die Spalten mid, mname und chef beinhaltet.

    Nun habe ich eine bestimmte Anfrage mit ihrem Ergebnis:

    Code:
    SELECT chef, mname FROM mitarbeiter
    WHERE chef in (SELECT mid FROM mitarbeiter)
    GROUP BY chef, mname
    Ergebnis:

    chef mname
    10 Maier
    1 Chef11
    9 Maier
    4 Mita4
    2 Mita3
    10 Huber
    1 Mita1
    1 Mita2


    Wie ihr seht, kommen in der Spalte CHEF mehrere Werte mehrfach vor ( die 1 und 10). Ich möchte die Anfrage aber so gestalten, dass ich nur die mnamen bekomme, bei denen die chef id aber nur EINMAL vorkommt.
    Das wären als logisches Ergebnis 9-Maier, 4-Mita4, 2-Mita3.

    Habe ewig herumprobiert (auch mit count und HAVING etc) aber komme einfach nicht drauf...

  • #2
    Wie wäre es hiermit?
    [highlight=sql]SELECT chef, mname FROM mitarbeiter
    WHERE chef in (SELECT mid FROM mitarbeiter)
    GROUP BY chef, mname
    HAVING COUNT(DISTINCT chef) = 1[/highlight]

    Gruss

    Comment


    • #3
      leider nein. das ergebnis deiner variante liefert folgendes:

      chef mname
      1 Chef11
      1 Mita1
      1 Mita2
      2 Mita3
      4 Mita4
      9 Maier
      10 Huber
      10 Maier


      In der Ausgabe dürfen alle Zeilen mit einer 1 und 10 in der SPalte chef nicht vorkommen da diese ja mehr als einmal auftauchen...
      Ist also doch abgefhrener als ich dachte. hat jemad noch ne andere idee?

      Comment


      • #4
        [HIGHLIGHT="SQL"]WITH Data (chef ,mname )
        AS ( SELECT 10, 'Maier' UNION ALL
        SELECT 1, 'Chef11' UNION ALL
        SELECT 9, 'Maier' UNION ALL
        SELECT 4, 'Mita4' UNION ALL
        SELECT 2, 'Mita3' UNION ALL
        SELECT 10, 'Huber' UNION ALL
        SELECT 1, 'Mita1' UNION ALL
        SELECT 1, 'Mita2'
        )
        SELECT Data.*
        FROM Data
        JOIN (SELECT COUNT (Chef) AS Anzahl
        , CHEF
        FROM Data
        GROUP BY Chef
        HAVING COUNT(Chef) = 1
        ) AS X ON X.Chef = Data.Chef [/HIGHLIGHT]
        [HIGHLIGHT="Ergebnis"] chef mname
        ----------- ------
        2 Mita3
        4 Mita4
        9 Maier
        [/HIGHLIGHT]
        und das WITH sorgt auch hier nur wieder für die Daten....

        Comment


        • #5
          okay, krass. darauf wäre ich jetzt mein leben nicht gekommen xD danke!

          Comment


          • #6
            einen haken gibt es aber noch. am anfang hast du ja das ergebnis der oberen abfrage einfach hier reingeschrieben:

            Code:
            AS ( SELECT 10, 'Maier' UNION ALL
                    SELECT 1, 'Chef11' UNION ALL
                    SELECT 9, 'Maier'  UNION ALL
                    SELECT 4, 'Mita4'  UNION ALL
                    SELECT 2, 'Mita3'  UNION ALL
                    SELECT 10, 'Huber' UNION ALL
                    SELECT 1, 'Mita1'  UNION ALL
                    SELECT 1, 'Mita2'
            das setzt ja vorraus, dass ich dieses ergebnis weiß. aber das tu ich eigentl nicht. ich muss auf jeden fall die abfrage machen, die ich ganz oben schonmal geschrieben habe. und die muss man halt dann so erweitern, um das entsprechende ergebnis zu erhalten...

            Comment


            • #7
              Originally posted by Deeet88 View Post
              ich muss auf jeden fall die abfrage machen, die ich ganz oben schonmal geschrieben habe. und die muss man halt dann so erweitern, um das entsprechende ergebnis zu erhalten...
              wer hält Dich davon ab???

              Comment


              • #8
                zum besseren verständnis:

                meine erste Ausgabe beschreibt, welche Personen Chefs sind und somit mindestens einen Angestellten haben.
                Die Grundaufgabenstellung ist: welche mitarbeiter haben genau einen angestellten?

                Ich kann also nur eine einzige Abfrag verwenden. Würde ich deine nehmen, hätte ich theoretisch 2 Stück. Denn für

                Code:
                AS ( SELECT 10, 'Maier' UNION ALL
                        SELECT 1, 'Chef11' UNION ALL
                        SELECT 9, 'Maier'  UNION ALL
                        SELECT 4, 'Mita4'  UNION ALL
                        SELECT 2, 'Mita3'  UNION ALL
                        SELECT 10, 'Huber' UNION ALL
                        SELECT 1, 'Mita1'  UNION ALL
                        SELECT 1, 'Mita2'
                muss man ja erst die erste gemacht haben, um dieses Infos überhaupt zu haben...
                Somit muss die Anfrage zuerst selektieren, welche Personen Chefs sind und dann im Anschluss noch schauen, welche nur einen Angestellten haben.

                Comment


                • #9
                  Hallo,
                  Originally posted by ebis View Post
                  ...und das WITH sorgt auch hier nur wieder für die Daten....
                  Wer lesen kann ist klar im Vorteil ...
                  Vergiss einfach alles vor dem SELECT DATA.*, dies dient nur dazu, temporär Beispieldaten zu erzeugen, um nicht eine entsprechende Tabelle anlegen zu müssen.

                  Gruß Falk
                  Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                  Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                  Comment


                  • #10
                    okay.... so dann in etwas?

                    Code:
                    SELECT chef, mname FROM mitarbeiter
                    WHERE chef in (SELECT mid FROM mitarbeiter)
                    GROUP BY chef, mname
                    JOIN    (SELECT   COUNT (Chef) AS Anzahl
                                      ,  CHEF
                                FROM     DATA
                                GROUP BY Chef
                                HAVING   COUNT(Chef) = 1
                               ) AS X    ON   X.Chef = mitarbeiter.Chef

                    Comment


                    • #11
                      Originally posted by Deeet88 View Post
                      okay.... so dann in etwas?

                      [HIGHLIGHT="SQL"]SELECT chef, mname FROM mitarbeiter
                      WHERE chef in (SELECT mid FROM mitarbeiter)
                      GROUP BY chef, mname
                      JOIN (SELECT COUNT (Chef) AS Anzahl
                      , CHEF
                      FROM DATA
                      GROUP BY Chef
                      HAVING COUNT(Chef) = 1
                      ) AS X ON X.Chef = mitarbeiter.Chef[/HIGHLIGHT]
                      NEIN, würde durch ausprobieren Dir allerdings auch der SQL-Compiler verraten
                      Zeile 2 wozu? also wech damit
                      Zeile 3 wozu? aslo wech damit
                      (und wenn nochmal gruppiert werden müßte, dann ans Ende (hinter Zeile 9) und außerdem müßte Spalte Chef sowieso einen Tabellennamen vorweg bekommen, da nicht eindeutig
                      Zeile 6: Du hast keine virtuelle Tabelle namens Data, also kannst Du sie wohl kaum benutzten -> also data durch mitarbeiter ersetzen

                      m. a. W., so wirds eher was:
                      [HIGHLIGHT="SQL"]SELECT mo.chef
                      , mo.mname
                      FROM mitarbeiter AS mo
                      JOIN (SELECT COUNT (Chef.) AS Anzahl
                      , CHEF
                      FROM mitarbeiter
                      GROUP BY Chef
                      HAVING COUNT(Chef) = 1
                      ) AS mi ON mi.Chef = mo.Chef[/HIGHLIGHT]

                      und Formatierung von SQL in Beiträgen

                      Comment

                      Working...
                      X