Announcement

Collapse
No announcement yet.

GROUP BY will nicht_Lösungsvorschlag!?

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

  • GROUP BY will nicht_Lösungsvorschlag!?

    Liebe SQL-Wissenden,

    ich hoffe ihr könnt mir, einem begeisterten SQL-Einsteiger, ein wenig Starthilfe geben.

    Mein Problem:
    Ich beschäftige mich mit einer botanischen Datenbank basierend auf SQL Server 2005.
    Der aktuelle Name einer Art wird dabei im Feld "IdArt" abgelegt.
    Bei der Namensgebung von Organismen tritt immer wieder das Problem der Synonymie auf - sprich eine Art hat mehrere Namen wobei jedoch nur einer gültig ist.
    In der Datenbank gibt es nun neben dem Feld "IdArt" nun auch für jene Synonym verwendete Namen das Feld "IdSynonym".

    Zu jeder Art können n Objekte(Individuen) gesammelt werden.

    Beispiel 1: Kein Synonym
    IdArt IdSynonym Name Objekt
    1 1 'Blaue Pflanze' 1

    Beispiel 2: Synonym
    IdArt IdSynonym Name Objekt
    1 2 'Blaue Pflanze' 1

    Ich entschuldige mich für die Langatmigkeit!
    Nun zum Code:

    [highlight=sql]SELECT
    A.IdArt, A.IdSynonym, A.Name, A.Rang
    B.IdObjekt, B.IdObjektArt

    FROM Objekttab as B
    INNER JOIN Arttab as A ON A.IdArt = B.IdObjektArt

    WHERE A.Rang = 'Phyta'
    and A.IdArt <> A.IdSynonym

    ORDER BY A.Name asc[/highlight]
    Soweit so gut, nun will ich das Ganze jedoch auf Basis der Objekte(Individuen) zusammenfassen - sprich die Synonymen Arten werden nur noch einmal angezeigt.

    Ein
    [highlight=sql]GROUP BY B.IdObjektArt[/highlight]
    funktioniert hier leider nicht - Fehlermeldung!


    Ich hoffe ich haben durch den ewig langen Text nicht sämtliche Forenregeln gebrochen und schließe das Post nun mit einem
    DANKE im Voraus!!!

    lg
    Phips
    Zuletzt editiert von Phips7; 28.09.2010, 13:56.

  • #2
    Hallo,
    Originally posted by Phips7 View Post
    ...funktioniert hier leider nicht - Fehlermeldung!
    Mein Glaskugel ist leider etwas verregnet, deshalb kann ich die Fehlermeldung nicht sehen...

    Aber ich vermute mal das es an deiner Gruppierung liegt. In der Group By-Klausel müssen alle Felder aus dem Select aufgeführt werden, die nicht aggregiert (bzw. nicht funktional abhängig sind). In deinem Fall wären das wohl ALLE Felder, da keine Aggregatfunktionen verwendet werden - ein GROUP BY macht bei dieser Abfrage also keinen Sinn.

    Zur Zusammenfassung bzw. Anzeige nur eines aus mehreren passenden DS siehe: Bei "doppelten" Datensätzen nur einen anzeigen

    Tipp: Formatierung von SQL in Beiträgen

    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


    • #3
      Liebe Leute, lieber Falk,

      für euch der neu formatierte Beitrag. Mein Problem kann ich selbst beim besten Willen "noch" nicht lösen - da ich ein wenig grippig bin habe ich jedoch eine gute Ausrede - Konzentrationsprobleme.

      Ich weiß leider nicht wie ich da weiter Vorgehen soll - ein SUBSELECT bei WHERE wird vielleicht die Lösung sein...aber wie.
      Ich habe folgenden (sicher grauenhaften) Code "zusammengebastelt" wobei als Vorlage der Link von Falk diente.

      Nun zum Code:

      [highlight=sql]SELECT
      A.IdArt, A.IdSynonym, A.Name, A.Rang
      B.IdObjekt, B.IdObjektArt

      FROM Objekttab as B
      INNER JOIN Arttab as A ON A.IdArt = B.IdObjektArt

      WHERE A.Rang = 'Phyta'
      and A.IdArt <> A.IdSynonym
      and B.IdObjektArt =
      (SELECT B.IdObjektArt
      FROM Objekttab as B
      LEFT OUTER JOIN dbo.tObjects as C
      ON B.objDetIdTaxon = C.objDetIdTaxon)

      ORDER BY A.Name asc[/highlight]

      Als Fehlermeldung bekomme ich hier:
      Msg 512, Level 16, State 1, Line 1
      Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


      Ich werd noch verrückt!
      Vielen Dank an jene die mir helfen dies zu verhindern!

      lg
      Phips

      Comment


      • #4
        Hallo,

        sorry, ich habs mir wirklich mehrfach durchgelesen und versucht dein Statement zu verstehen, aber ohne AUSSAGEKRÄFTIGE Beispieldaten und eine Darstellung des gewünschten Ergebnisses wird das wohl nichts...

        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


        • #5
          Der Fehler mit der Subquery ist wohl zu verstehen, wenn man sich vor Augen führt, dass du in der Where-Klausel an der Stelle ... AND B.IdObjektArt = (SELECT B.IdObjektArt FROM Objekttab AS B ... zB. die Werte 2, 3 und 4 vom Subselekt zurückkriegst. Das macht bei einem '=' natürlich Probleme. Aber ändere diese Stelle mal in ... AND B.IdObjektArt IN (SELECT distinct B.IdObjektArt FROM Objekttab AS B ... und schaue, was da rauskommt. Zumindest die Fehlermeldung sollte weg sein

          bye,
          Helmut

          Comment


          • #6
            Hallo!

            Die folgenden zwei Tabellen dienen der Veranschaulichung.
            Aconitum neomontanum ist ein Synonym von Aconitum napellus L. ssp. napellus.

            Meine Abfrage zielt darauf ab vom momentanen Datenbestand nur die synonymen Arten zu erhalten
            Code:
            A.IdArt <> A.IdSynonym
            Als Ergebnis erhalte ich eine Tabelle zu jedem Objekt das einen Synonymen Namen trägt.
            Das Feld IdSynonym zeigt an welcher Name der aktuelle ist. Sind IdArt und IdSynonym gleich ist dies der aktuelle Name(Tabelle2).

            Nun möchte ich wissen, wie viele verschiedene synonyme Arten gefunden wurden - sprich die Tabelle 1 müsste in dem Fall auf eine Zeile zusammenschrumpfen. Dies wollte ich anfangs durch ein GROUP BY lösen aber das ist ja, wie ich jetzt weiß, nicht möglich.

            Nachdem ich den Tipp von Helmut umsetzte bekam ich wieder das "alte" Ergebnis - jedes Objekt mit einem synonymen Artnamen wurde angezeigt.
            Zumindest war der Fehler weg...

            Tabelle1:
            IdArt IdSynonym Artname IdObjekt IdObjektArt
            320855 316305 Aconitum neomontanum 17308 320855
            320855 316305 Aconitum neomontanum 17309 320855
            320855 316305 Aconitum neomontanum 17310 320855
            320855 316305 Aconitum neomontanum 17311 320855
            320855 316305 Aconitum neomontanum 17312 320855
            320855 316305 Aconitum neomontanum 17313 320855
            320855 316305 Aconitum neomontanum 17314 320855
            320855 316305 Aconitum neomontanum 17315 320855

            Tabelle2:
            IdArt IdSynonym Artname IdObjekt IdObjektArt
            316305 316305 Aconitum napellus L. ssp. napellus 20001 316305


            Der nach Helmut angepasste Code:

            [highlight=sql]SELECT
            A.IdArt, A.IdSynonym, A.Name, A.Rang
            B.IdObjekt, B.IdObjektArt

            FROM Objekttab as B
            INNER JOIN Arttab as A ON A.IdArt = B.IdObjektArt

            WHERE A.Rang = 'Phyta'
            and A.IdArt <> A.IdSynonym
            and B.IdObjektArt IN
            (SELECT DISTINCT B.IdObjektArt
            FROM Objekttab as B
            LEFT OUTER JOIN dbo.tObjects as C
            ON B.objDetIdTaxon = C.objDetIdTaxon)

            ORDER BY A.Name asc[/highlight]


            Ich danke euch wirklich für eure Mühen!!!
            Hoffentlich sind meine Erläuterungen nun besser!

            lg
            Phips

            Comment


            • #7
              OK, also mal konkreter Fragen...
              1. Wie sieht die Struktur von Tabelle "Rang" aus?
              2. Wie sieht die Struktur von Tabelle "Objekttab" aus?
              3. Welche Beziehungen (wenn sie sich nicht eindeutig aus der Benamung ergeben) gibt es zwischen diesen?
              4. Welche (Beispiel)Daten enthält Tabelle "Rang"?
              5. Welche (Beispiel)Daten enthält Tabelle "Objekttab"?
              6. Wie sieht ein gewünschtes Ergebnis auf Grundlage der (Beispiel)Daten aus?


              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


              • #8
                Hallo!

                Um das ganze zu vereinfachen...Rang kann weg ist an dieser Stelle nicht essentiell.

                Die Objekttab ist die zentrale Tabelle, und ist über FKs mit der Arttabelle in Beziehung gesetzt.
                Sprich ein Objekt MUSS einen Artnamen haben - einer Art können viele Objekte zugeteilt sein.

                A.IdArt und A.IdSynonym sind zwei Spalten der Tabelle Arttab die in Beziehung zueinander stehen.

                Die Objekttab weist eine Fülle an Spalten auf - z.B. die Spalte B.IdObjektArt oder die eindeutige Nummer der Objekte B.IdObjekt.

                Mir fällt jetzt in der Eile nicht ein wie ich mich deutlicher ausdrücken könnte - da ich mich der Sache ohnehin erst mitte nächster Woche wieder annehmen kann werd ich bis dahin etwas nachgrübeln.

                [highlight=sql]SELECT
                A.IdArt, A.IdSynonym, A.Name
                B.IdObjekt, B.IdObjektArt

                FROM Objekttab as B
                INNER JOIN Arttab as A ON A.IdArt = B.IdObjektArt

                WHERE A.IdArt <> A.IdSynonym
                and B.IdObjektArt
                IN (SELECT DISTINCT B.IdObjektArt
                FROM Objekttab as B
                LEFT OUTER JOIN dbo.tObjects as C
                ON B.objDetIdTaxon = C.objDetIdTaxon)

                ORDER BY A.Name asc[/highlight]


                VIELEN DANK!!

                Bis bald (klingt schn fast wie eine Drohung)

                lg
                Phips

                Comment

                Working...
                X