Announcement

Collapse
No announcement yet.

Ausgabe von doppelten Einträgen

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

  • Ausgabe von doppelten Einträgen

    Hallo Zusammen,

    ich habe ein Problem mit der Ausgabe von doppelten Einträgen.
    Es existiert eine Tabelle t1 mit einer Auftrags_ID, Schaden_ID, Freitext, Codestufe 1 und Codestufe 2 zur Erfassung von Schäden/Mängeln am KFZ.

    Im Freitextfeld wird genau das eingegeben das der Fahrer/Halter des Fahrzeuges beanstandet. In der Codestufe 1 wird diesem Sachverhalt ein Code zugewiesen, der sich in einem bestimmten Code der Stufe 2 wiederfindet. Mehrere Codes der Stufe 1 können sich also in ein und demselben Code der Stufe 2 wiederfinden.

    Ich möchte alle die Datensätze selektieren, die sich in der Codestufe 1 unterscheiden, aber dieselbe Codestufe 2 besitzen, gruppiert werden soll nach Auftrags_ID.

    Vielen Dank für eure Hilfe!
    Zuletzt editiert von Neshi; 12.01.2016, 17:15.

  • #2
    hast Du mal den MINUS Operator getestet?
    <select statement 1 >
    minus
    <select statement 2>

    funktioniert also wie union nur umgekehrt.
    Die Where clauses können sich natürlich unterscheiden, die Struktur der beiden Statementausgaben muss natürlich gleich sein.
    Gruß, defo

    Comment


    • #3
      Hallo defo,

      ich verstehe überhaupt nicht was du meinst

      Comment


      • #4
        Ich verstehe leider das Problem nicht. Schreib mal ein paar Datensaetze hin, auch mit redundanten Daten da das ja anscheinend Dein Problem ist. Danach schreibst Du die gewuenschte Ausgabe hin. So kann ich mir vielleicht eher vorstellen wie die Daten aussehen, wie sie zusammen haengen und wie man dafuer ein passendes Query schreibt. Du kannst das ganze in Oracle auch mit dem "WITH ... AS" Statement simulieren, dann hat jeder mit einer Oracle Datenbank gleich ein lauffaehiges Beispiel.

        Comment


        • #5
          Ich hab das glaube ich auch total missverstanden.
          Aber schon mal ein paar Anmerkungen:
          Gruppierung nach Auftragsid klingt nach einem Primärschlüssel, wenn Du das ausgibst oder auch gruppiert ausgibst, bekommst Du jeden einzelnen Datensatz.

          Select distinct Code2, code1 from t1
          order by code2

          sollte erstmal einen kleinen Ansatz liefern.
          Gruß, defo

          Comment


          • #6
            So, jetzt nochmal ausführlicher. Im Anhang findet ihr die Tabelle.test3.jpg

            Mit folgender Anweisung habe ich versucht die doppelten Einträge zu finden:

            Select Auftrags_ID, Codestufe2, Count(Codestufe2) from t1 Group by Auftrags_ID, Codestufe2 having Count (codestufe)>1 order by Auftrags_ID;


            Ich möchte allerdings nur die selektieren, die sich auch in der Codestufe 1 unterscheiden (aus der Tabelle also die Zeilen 1 und 2 und 4 und 5)

            Ich hoffe jetzt ist es verständlicher!

            Comment


            • #7
              Hier mal ein Beispiel, wie Du uns Daten bereitstellen kannst, damit wir helfen können (aid=AuftragsID, sid=SchadensID):

              Code:
              WITH t1(aid, sid, code1, code2) AS 
               (SELECT  1,   1, 10, 1 FROM dual UNION ALL
                SELECT  1,   2, 11, 1 FROM dual UNION ALL
                SELECT  1,   3, 21, 2 FROM dual UNION ALL
                SELECT  1,   4, 22, 2 FROM dual UNION ALL
                SELECT  1,   5, 22, 2 FROM dual UNION ALL
                SELECT  1,   6, 23, 2 FROM dual UNION ALL
                SELECT  2,   1, 10, 1 FROM dual UNION ALL
                SELECT  2,   5, 17, 1 FROM dual UNION ALL
                SELECT  2,   6, 10, 1 FROM dual UNION ALL
                SELECT  2,   8, 22, 2 FROM dual UNION ALL
                SELECT  2,   9, 22, 2 FROM dual)
              SELECT aid, sid, code1, code2
                   , DENSE_RANK() OVER (PARTITION BY aid, code2 ORDER BY code1)
                FROM t1   
              ORDER BY aid, code2, rn;
              
              AID	SID	CODE1	CODE2	RN
              1	1	10	1	1
              1	2	11	1	2
              1	3	21	2	1
              1	4	22	2	2
              1	5	22	2	2
              1	6	23	2	3
              2	1	10	1	1
              2	6	10	1	1
              2	5	17	1	2
              2	8	22	2	1
              2	9	22	2	1
              Alle Daten eines Auftrages mit identischem code1, code2 bekommen denselben RANK. Das würde bedeuten, Du benötigst pro Auftragsnummer nur den ersten Satz jedes rn.

              Ergänzung:
              Jetzt hast Du gerade Beispieldaten geliefert

              Comment


              • #8
                Vielen Dank, aber ich befürchte das ist nicht das was ich brauche. Ich benötige die Zeilen innerhalb eines Auftrags, die sich in Codestufe 1 unterscheiden, aber in Codestufe 2 wieder identisch sind.
                Der Hintergrund ist Folgender: Auswertungen werden über die Codestufe 2 gemacht und hier stellt sich die Frage ob die Codestufe 2 noch differenzierter sein muss als bisher. Deshalb muss ich sehen, welche Codes aus Stufe 1 dem selben Code der Stufe 2 zugeordnet sind.
                Zuletzt editiert von Neshi; 13.01.2016, 10:55.

                Comment


                • #9
                  Meinst du so?

                  [highlight=sql]with t1 as
                  (select 1 as auftrags_id,
                  1 as schaden_id,
                  'Bremse schleift' as freitext,
                  'Bremsbeläge' as codestufe_1,
                  'Bremsen' as codestufe_2
                  from dual
                  union all
                  select 1, 2, 'Bremskraft', 'Bremsscheiben', 'Bremsen'
                  from dual
                  union all
                  select 1, 3, 'Öl fehlt', 'Ölstand zu niedrig', 'Öl'
                  from dual
                  union all
                  select 2, 1, 'Klimaanlage heizt', 'Klimaanlage Sicherung', 'Klimaanlage'
                  from dual
                  union all
                  select 2,
                  2,
                  'Klimaanlage defekt',
                  'Klimaanlage Flüssigkeit',
                  'Klimaanlage'
                  from dual
                  union all
                  select 3, 1, 'Springt nicht mehr an', 'Zündung defekt', 'Zündung'
                  from dual
                  union all
                  select 3, 2, 'Auspuff zu laut', 'Auspuff defekt', 'Auspuff'
                  from dual)
                  --Select Auftrags_ID, Codestufe_2, Count(Codestufe_2) from t1 Group by Auftrags_ID, Codestufe_2 having Count (codestufe_1)>1 order by Auftrags_ID;
                  select auftrags_id, count(distinct codestufe_1) as anzahl, codestufe_2
                  from t1
                  group by auftrags_id, codestufe_2
                  having count (distinct codestufe_1) > 1[/highlight]

                  Comment


                  • #10
                    Das sieht gut aus! Das war allerdings nur Schritt eins! Ich benötige nun noch aus Informationen aus einer Tabelle t2 (Fahrzeugmarke und Jahr) um auch darüber zu gruppieren.
                    Meine erste Idee war, einfach einen Select drumherum zu bauen

                    Select * from t2 where t2.auftrags_id in (select auftrags_id, Count(distinct codestufe 1).....) Hier bekomme ich aber immer die Fehlermeldung "Zu viele Werte".

                    Comment


                    • #11
                      Habe nicht ganz verstanden was du machen möchtest, aber dein SQL Versuch scheitert am Vergleich mit dem IN Operator.
                      Von der Syntax her würde es so beispielsweise funktionieren...
                      Select * from t2 where t2.auftrags_id in (select auftrags_id from (select auftrags_id, Count(distinct codestufe 1).....))

                      Comment


                      • #12
                        Stimmt, jetzt funktioniert es.
                        Ich benötige aus einer anderen Tabelle noch ein paar Daten zum Fahrzeugtyp und das Jahr in dem der Schaden gemeldet wurde.
                        Wenn ich mir jetzt allerdingst Daten aus beiden Tabellen anzeigen lassen möchte, dann bekomme ich alle Einträge zu den Schäden angezeigt, nicht nur die doppelten die ich vorher selektiert habe. Und wie ich darauf einschränken kann verstehe ich nicht.

                        Beispiel:

                        select t2.Auftrags_id, t2_Kunden_ID, t2.Auftragsdatum, t2.Fahrzeugmarke, t1.Freitext, t1.Codestufe1, t1.Codestufe2 from t1, t2
                        where t1.Auftrags_id = t2.Auftrags_id and t2.Auftrags_id in (select auftrags_id from (select auftrags_id, Count(distinct codestufe 1) as anzahl, codestufe_2 from t1
                        Group by auftrags_id, codestufe_2
                        having Count (distinct codestufe_1)>1));

                        Ich möchte also nur die doppelten Einträge sehen und dann im nächsten Schritt nach Auftragsdatum und nach Fahrzeugmarke gruppieren.
                        Vielen Dank für deine Hilfe!!!

                        Comment


                        • #13
                          Ah ok verstehe, dann musst du nur die beiden Tabellen miteinander verbinden.

                          [highlight=sql]
                          select *
                          from t1
                          join
                          (select auftrags_id, Count(distinct codestufe 1).....) t2
                          on (t1.auftrags_id = t2.auftrags_id)
                          [/highlight]

                          Comment


                          • #14
                            Kannst Du nicht einfach mal ein Beispiel hinschreiben? Ich verstehe ueberhaupt nicht welches Problem Du hast und so geht es wohl den meisten anderen hier auch. Ein Beispiel Tabelle als Eingabe und das gewuenschte Ergebnis dazu. Dann kann man Dir auch besser helfen. Auf raten habe ich persoenlich nicht so viel Lust.

                            Comment


                            • #15
                              Hier eine analytische Lösung, zunächst beide Tabellen (t1 Schäden, t2 Aufträge)verbinden und das Vorkommen von doppelten aid, code1, code2 zählen, dann im äußeren SELECT die mehrfachen filtern.
                              Falls Du noch Fragen und Ergänzungen hast, gebe uns unbedingt die Daten und das erwartete Ergebnis idealerweise so wie hier mit Beispieldaten.

                              Code:
                              WITH t1(aid, sid, code1, code2) AS 
                               (SELECT  1,   1, 10, 1 FROM dual UNION ALL
                                SELECT  1,   2, 11, 1 FROM dual UNION ALL
                                SELECT  1,   3, 21, 2 FROM dual UNION ALL
                                SELECT  1,   4, 22, 2 FROM dual UNION ALL
                                SELECT  1,   5, 22, 2 FROM dual UNION ALL
                                SELECT  1,   6, 23, 2 FROM dual UNION ALL
                                SELECT  2,   1, 10, 1 FROM dual UNION ALL
                                SELECT  2,   5, 17, 1 FROM dual UNION ALL
                                SELECT  2,   6, 10, 1 FROM dual UNION ALL
                                SELECT  2,   8, 22, 2 FROM dual UNION ALL
                                SELECT  2,   9, 22, 2 FROM dual),
                                  t2(anr, kennzeichen, marke) AS
                               (SELECT 1, 'AA A 123', 'Audi' FROM dual UNION ALL    
                                SELECT 2, 'OP B 789', 'Opel' FROM dual)    
                              SELECT * 
                                FROM
                               (SELECT aid, sid, code1, code2, kennzeichen, marke
                                     , count(*) OVER (PARTITION BY aid, code1, code2) cnt
                                  FROM t1, t2   
                                 WHERE t1.aid=t2.anr)
                               WHERE cnt>1;  
                              
                              AID	SID	CODE1	CODE2	KENNZEICHEN	MARKE	CNT
                              -----------------------------------------------------------------------
                              1	4	22	2	AA A 123	Audi	2
                              1	5	22	2	AA A 123	Audi	2
                              2	1	10	1	OP B 789	Opel	2
                              2	6	10	1	OP B 789	Opel	2
                              2	8	22	2	OP B 789	Opel	2
                              2	9	22	2	OP B 789	Opel	2

                              Comment

                              Working...
                              X