Announcement

Collapse
No announcement yet.

Bestimmte Einträge "herausfiltern", wenn doppelt..

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

  • Bestimmte Einträge "herausfiltern", wenn doppelt..

    Hallo zusammen,

    Ich rätsele hier über ein Problem, wo ich gar nicht mal sicher bin, ob das mit "purem SQL" überhaupt lösbar ist, oder doch eher in Richtung Scripting geht...

    Ich versuch es mal erst hier in allgemeinen SQL-Forum.. ansonsten müsste ich mich wohl DBMS - spezifisch weiter durchfragen (DBMS ist ein Advantage Database Server).

    Folgende Tabelle als Beispiel (vereinfacht)

    HTML Code:
    <table>
     <tr> <th>ID </th> <th>Kundennummer </td> <td>Branche </td> <td>Konto </td> </th> </tr>
     <tr> <td>1 </td> <td>0999 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
     <tr> <td>2 </td> <td>1000 </td> <td>Dienstleistung </td> <td>4072 </td> </tr>
     <tr> <td>3 </td> <td>1001 </td> <td>Gewerbe </td> <td>4073 </td> </tr>
     <tr> <td>4 </td> <td>1001 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
     </table>
    Problematisch sind hierbei die Einträge mit Branche = "(unbekannt)", die möchte ich raushaben.. aber NUR, wenn für denselben Kunden eine Branche
    <> "(unbekannt)" vorhanden ist... (also die Branche bekannt ist).

    Kriege ich das überhaupt "pur" mit SQL hin? Habe hier irgendwie gerade einen Block.....

    Sorry für den wenig aussagekräftigen Titel, aber ich konnte das nicht griffig reduzieren...

    EDIT: Hmmm, geht HTML hier nicht (obwohl Button vorhanden) oder mach ich was verkehrt?

  • #2
    Hallo!

    select * from meineDatentabelle where branche = '(unbekannt)'
    and kundennummer in(select kundennummer from meineDatenTabelle where branche <> '(unbekannt)')

    so vielleicht?

    BYE BERND

    Comment


    • #3
      Danke für die prompte Antwort.. aber klappt so bei mir nicht.

      Ich bekomme bei der Abfrage so ziemlich alle mit "(unbekannt)" zurück.. ich brauch ja nur die mit (unbekannt), wo KEIN entsprechender Eintrag mit einer bekannten Branche drin ist....

      Obwohl das eigentlich auch nur ein Zwischenschritt ist, im Endeffekt möchte ich eigentlich die Tabelle "bereinigt" haben, also alle Einträge mit "(unbekannt)" raus, wenn für den entsprechenden Kunden ein Eintrag mit einer bekannten Branche drin ist.

      Comment


      • #4
        Äh ja.

        mach aus
        kundennummer in(select

        ein
        kundennummer NOT in(select

        BYE BERND

        Comment


        • #5
          Du benötigst die inverse Abfrage:
          [highlight="sql"]
          select
          *
          from
          meineDatentabelle
          where
          branche = '(unbekannt)' and
          kundennummer not in
          (
          select kundennummer from meineDatenTabelle where branche <>'(unbekannt)'
          )
          [/highlight]

          Comment


          • #6
            ..hmmm, entweder ist mein Beispiel (das ein verkürztes Beispiel aus einer umfangreicheren Tabelle hier ist) irgendwie inkorrekt... oder..

            Jedenfalls bekomme ich bei der inversen Abfrage KEINE Treffer mehr..

            Hmmm.

            Ich bau mal eben schnell genau die Beispieltabelle nach, nicht das wir hier aneinander vorbeireden...

            Danke nochmals für euren Einsatz, super, hätte nicht gedacht dass hier so schnell Antworten kommen!! Daumen hoch.

            Comment


            • #7
              In der Tat, irgendwie verhält sich mein hier gepostetes Beispiel irgendwie anders als die tatsächliche Tabelle.

              Muss das noch mal gegenprüfen....

              Comment


              • #8
                Okay, ich wandele die Daten noch mal ab:

                HTML Code:
                <table>
                 <tr> <th>ID </th> <th>Kundennummer </td> <td>Branche </td> <td>Konto </td> </th> </tr>
                 <tr> <td>1 </td> <td>0999 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
                 <tr> <td>2 </td> <td>0999 </td> <td>Dienstleistung </td> <td>4072 </td> </tr>
                 <tr> <td>3 </td> <td>1000 </td> <td>Gewerbe </td> <td>4073 </td> </tr>
                 <tr> <td>4 </td> <td>1000 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
                 </table>
                So erhalte ich keine Treffer, aber entweder sollte ich es irgendwie schaffen, mir nur die (unbekannt) anzeigen zu lassen (jetzt nicht aber denken, einfach nach branche = '(unbekannt)' zu filtern) oder vorzugsweise die (unbekannt) einfach rausschmeissen.

                Die Krux ist aber, dass die Daten auch so aussehen können.

                HTML Code:
                <table>
                 <tr> <th>ID </th> <th>Kundennummer </td> <td>Branche </td> <td>Konto </td> </th> </tr>
                 <tr> <td>1 </td> <td>0999 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
                 <tr> <td>2 </td> <td>0999 </td> <td>Dienstleistung </td> <td>4072 </td> </tr>
                 <tr> <td>3 </td> <td>1000 </td> <td>Gewerbe </td> <td>4073 </td> </tr>
                 <tr> <td>4 </td> <td>1000 </td> <td>(unbekannt) </td> <td>4074 </td> 
                 <tr> <td>5 </td> <td>1001 </td> <td>(unbekannt) </td> <td>4074 </td> </tr>
                 </table>
                Dort müsste dann das letzte '(unbekannt)' stehen bleiben, weil kein "Spezialfall" (also bekannte Branche) für diesen Kunden vorhanden ist.

                Übrigens, die Struktur der Tabelle kann ich nicht umstricken, die ist gegeben.

                Zu dem HTML-Code: mache ich da nun was verkehrt? Würde euch ja gern
                das "sauber" darstellen...

                Comment


                • #9
                  Das sieht vielversprechend aus:

                  select * from okexp where branche <> '(unbekannt)' and kundennummer IN
                  (select kundennummer FROM okexp where branche = '(unbekannt)' ) UNION
                  select * from okexp where branche = '(unbekannt)' and kundennummer NOT IN
                  (select kundennummer FROM okexp where branche <> '(unbekannt)' )

                  Zumindest scheint das in die richtige Richtung zu führen. Ob das auch eleganter geht?

                  Comment


                  • #10
                    Ja


                    select * from okexp where branche = '(unbekannt)' and kundennummer NOT IN
                    (select kundennummer FROM okexp where branche <> '(unbekannt)' )

                    Das war doppelt gemoppelt

                    BYE BERND

                    Comment


                    • #11
                      Hmm, irgendwie liefert die optimierte Fassung auf meinen Realdaten aber nicht die gleichen Treffer...

                      Mit dem UNION - Verhau habe ich 2594 Treffer, mit der einfachen Variante 2056.. ganze Kunden fallen so raus. Das UNION Konstrukt liefert bei mir hier brauchbare Ergebnisse, soweit ich sehe.. warum das andere nicht erwartungsgemäß klappt.. müsste ich noch prüfen.

                      Comment


                      • #12
                        select * from tabelle t1 where t1.branche = '(unbekannt)'
                        and exists
                        (select Tabelle.kundennummer from Tabelle where
                        t1.kundennummer=tabelle.kundennummer and
                        Tabelle.branche <> '(unbekannt)')

                        Gruß frauwue
                        Zuletzt editiert von frauwue; 04.02.2008, 14:58.
                        docendo discimus

                        Comment

                        Working...
                        X