Announcement

Collapse
No announcement yet.

Daten aus verschiedenen Tabellen für Export auslesen

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

  • Daten aus verschiedenen Tabellen für Export auslesen

    Hallo liebes Forum,
    ich muß Daten aus verschiedenen Tabellen auslesen um diese zu exportieren.
    Mein Problem ist, der Export muß einer bestimmten Struktur folgen, damit die Daten in ein anderes System eingelesen werden können.
    In der einen Tabelle sind Fahrzeugrunddaten einhalten, in der anderen Tabelle steht die Fahrzeugausstattung.
    Die Schnittstelle des einlesenden Systems sieht vor, dass die Ausstattungen nur als 1 bzw 0 übergeben werden dürfen.
    1 = vorhanden
    0 = nicht vorhanden.

    Ich habe bereits mehrere Lösungswege probiert, laufe aber immer wieder vor die Wand. Daher währe ich für Eure Hilfe dankbar.

    Die Tabellen sehen grob so aus:

    Tabelle_Fahrzeug:
    Fahrgestellnummer;Kennzeichen;Zulassung; Farbe
    1;xy;01.01.2015;rot
    2;yx;05.07.2005;lila
    3;zz;16.12.2012;schwarz

    Tabelle_Ausstattung
    Fahrgestellnummer;Bezeichnung;Preis
    1;ABS;150,00
    1;SSD;657,65
    1;Alarm;1568,00
    2;Radio;253,99
    3;Radio;189,54
    3;SSD;547,48


    Die Ergebnismenge müsste lt. einlesender Schnittstelle so aussehen:

    Fahrgestellnummer;Kennzeichen;Zulassung ;ABS;SSD;Radio;Alarm;Farbe
    1;xy;01.01.2015;1;1;0;1;rot
    2;yx;05.07.2005;0;0;1;0;lila
    3;zz;16.12.2012;0;1;1;0;schwarz

  • #2
    Vermutlich gibt es mehr Ausstattungen als hier aufgeführt? Viel mehr?
    Wie breit soll die Ergebnistabelle werden?

    Bei der Aufgabenstellung kann man relativ leicht gegen die Wand laufen. Genaugenommen ist sie per statischem SQL nur lösbar, wenn es eine feste Liste von Ausstattungen gibt oder zumindest definiert ist, welche der vielen Ausstattungen im Export berücksichtigt werden sollen. Dafür muss dann ein SQL Statement gebaut werden.

    Stichworte dazu sind Pivot oder Crosstable.
    Diese SQL Funktionen sind im übrigen bei nahezu jedem DB Hersteller unterschiedlich umgesetzt.

    Workarounds:
    SQL dynamisch zusammenbauen nach Bedarf
    oder
    Datenmenge im Client aufbereiten.
    oder
    Ein Export bzw. besser Importformat vereinbaren, dass etwas geschickter ist. (Ich würde mal vermuten, dass am anderen Ende, dem Import der bis jetzt vergeblich aufbereiteten Daten wieder das gleiche Problem existiert, aus einer breiten Liste mit sehr vielen Merkmalsspalten muss wieder eine Liste gemacht werden.
    Gruß, defo

    Comment


    • #3
      Hallo defo,
      danke für Deine Schnelle Antwort.

      Die Ergebnistabelle hat 159 Spalten.
      Die Liste der Ausstattungen ist durch das Importsystem fest vorgegeben.
      Leider fürchte ich, dass sich eine große deutsche Autobörse nicht wegen uns auf eine neue Schnittstelle einlassen wird.

      Gruß Dirk

      Comment


      • #4
        Originally posted by Dirk Schindler View Post
        Die Ergebnistabelle hat 159 Spalten.
        Die Liste der Ausstattungen ist durch das Importsystem fest vorgegeben.
        Leider fürchte ich, dass sich eine große deutsche Autobörse nicht wegen uns auf eine neue Schnittstelle einlassen wird.
        Es schadet ja hoffentlich nicht, naheliegender Fragen zu stellen.
        Z.B. ob es Sinn macht, bei jeder neuen Ausstattung eine Schnittstelle umzubauen?
        Oder noch schlimmer: Müssen viele deutsche Bürger etwa auf neue Ausstattungsmerkmale ihrer Autos verzichten, weil es nur diese Schnittstelle gibt!
        Frag sie doch mal, wie sie das so machen und wieviel Spaß dabei alle haben (auch die anderen Zulieferer).
        Man kann es natürlich als schicksalhaft ansehen. Zum Glück musste das Feuer nicht vom Menschen erfunden werden, nur die Anwendungsmöglichkeiten.

        Nagut, also nach Deinen Zusatzinfos gibt es nicht viel mehr zu sagen, folgende Lösungen:
        baue ein SQL Statement mit ca 159 joins.
        baue eine Pivot SQL mit relativ wenig joins, sofern deine nachwievor unbekannte DB das unterstützt
        baue es in Excel oder einem anderen Tool Deiner Wahl zusammen
        schreibe ein Programm, dass diese Transformation erzeugt
        Gruß, defo

        Comment


        • #5
          Recht hast Du, die Frage schadet nicht

          Bei der Datenbank handelt es sich um den Advantagedatabaseserver.
          Da ich kein Programmierer bin, bleibt mir nur der Zugriff über den ADS-eigenen ARC32. Daher hatte ich mich schon auf die vielen Joins eingestellt.
          Mein problem ist halt, dass ich als Ausstattung immer alle Ausstattungsmerkmale zurückbekomme und es nicht schaffe, nur abzufragen, ob das Fahrzeug zb. ABS hat.
          Damit ich in der entsprechenden Exportspalte 1 oder 0 setzen kann.

          Comment


          • #6
            Originally posted by Dirk Schindler View Post
            Daher hatte ich mich schon auf die vielen Joins eingestellt.
            Mein problem ist halt, dass ich als Ausstattung immer alle Ausstattungsmerkmale zurückbekomme und es nicht schaffe, nur abzufragen, ob das Fahrzeug zb. ABS hat.
            Wie sieht denn so ein SQL bei Dir derzeit aus?

            ADS kanns wohl nicht, hier ist auf die Schnelle ein Pivot Workaround.
            http://devzone.advantagedatabase.com...t-query-in-ads

            Was Du mit Deinen Worten oben genau meinst, also Dein Plan, habe ich nicht verstanden.

            Im Prinzip geht es zu Fuß so (mit 160 joins)

            [highlight=SQL]
            select festesFeld1, festesFeld2, .. m1.Ausstattung as Alufelge, m2.Ausstattung as BluetoothConnect, m3...
            from fahrezeuge f join Ausstattung m1 on f.fgnr = m1.fgnr and m1.Ausstattung = 'Alufelge'
            join Ausstattung m2 on f.fgnr = m2.fgnr and m2.Ausstattung = 'BluetoothConnect'
            join Ausstattung m3 on f.fgnr = m3.fgnr ...
            [/highlight]
            (nur so hingeschrieben)
            Das Statemet kann man nun nach Schema F auch von einem Programm erstellen lassen.

            Oder Du machst es Dir ganz einfach mit:
            [highlight=SQL]
            Select <fahrzeugdaten felder>, <ausstattung felder> from fahrezeuge f join Ausstattung m1 on f.fgnr = m1.fgnr
            [/highlight]
            Das Ergebnis kippst Du in ein Spreadsheet Programm,
            machst eine Pivottabelle daraus (bedeutet im Zweifel auch ca 160 mal Spalte anklicken)
            und setzt den Datenwert auf "Anzahl von Feldinhalt'
            Dann hast Du für jedes Merkmal, das vorhanden ist, eine 1 in den Spalten stehen und automatisch alle Spalten / Ausstattungen, die Dein Select ergibt.


            Das Prinzip beruht am Ende darauf, dass Du nicht abfragst ob vorhanden, sondern alles ausgibst was da ist.
            Bei dem "künstlichen" Spaltenaufbau bleiben dann nicht vorhandene Merkmale auf NULL, das kannst Du "umrechenen" in 0.
            Vorhandene Merkmale werden einfach aufgrund ihrer Existenz in 1 umgerechnet.

            Das kannst Du auch so wiedererkennen, wenn Du gemäß Vorschlag mit Spreadsheetfunktionen arbeitest.
            Gruß, defo

            Comment


            • #7
              Originally posted by defo View Post
              ..
              Das Ergebnis kippst Du in ein Spreadsheet Programm,
              machst eine Pivottabelle daraus (bedeutet im Zweifel auch ca 160 mal Spalte anklicken)
              ..
              Korrektur
              160 mal klicken ist hier natürlich Blödsinn. Die 160 Spalten entstehen ja bei der Transformation aus einer einzigen, also einmal Klicken dafür.
              Die Anzahl der resultierenden Spalten leitet sich aus der Anzahl der eindeutigen Werte der Ursprungsspalte ab. Das Angenehme ist bei dieser Variante ja, dass es dynamisch ist und es keinen Unterschied macht, ob 10, 160, 1000 Spalten entstehen.
              Fraglich ist dabei allerdings, ob es sich für eine Automatisierung eignet (und ob man sich überhaupt der "Willkür" eines Spreadsheet Programms anvertraut)
              Gruß, defo

              Comment


              • #8
                Hallo Dirk,

                schau mal ob es im Advantage Database SQL den "list" Befehl gibt. SQLAnywhere hat ihn drin:
                z.B.
                select list(Bezeichnung) from Tabelle_Ausstattung Group by Fahrgestellnummer;

                Das Ergebnis soll dann eine Liste aller Bezeichnungen je Fahrgestellnummer in einer Zeile liefern.
                Das man dann noch auf Deine Soll-Liste hin anpassen, wäre aber schon mal die passende Richtung.

                Gruß, Uschi

                Comment

                Working...
                X