Announcement

Collapse
No announcement yet.

Spool-Problem

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

  • Spool-Problem

    Hallo Zusammen,

    wir müssen eine bestimmte csv liefern.

    Der Aufbau ist vereinfacht in etwa so.

    id;name;vorname;stati

    Im Feld Stati können, wie der Name schon sagt verschiedene Stati stehen.
    Diese sollen jeweils mit einem Komma getrennt eingefügt werden.

    Hier mal Beispiele
    1;meier;Müller;S1,S3,S7
    2;müller,heini;S2
    3;schmidt;juergen;S6,S7

    Wie kann ich dies realisieren?

    Das Design der Tabelle/n steht uns noch frei.

    Vielen Dank schon mal!

    Viele Grüß

    Martin

  • #2
    Wie soll das denn laufen?
    Über Anwenderprogramm/WebInterface interaktiv?
    Batch / Cron > Email/SFTP
    ..

    Bei "spool" denke ich spontan an die Möglichkeit in sqlplus mit aktivertem Logging zu verwenden, eben spool. Meinst Du das?
    Zuletzt editiert von defo; 20.04.2012, 12:41.
    Gruß, defo

    Comment


    • #3
      Hallo,

      [offtopic]
      Originally posted by Martin R. View Post
      ...Im Feld Stati können, wie der Name schon sagt verschiedene Stati stehen...
      Nur weils mir grad auffällt... Die Mehrzahl des Status ist die Status (mit langem u) oder die Statusse, niemals jedoch Stati .
      [/offtopic]

      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


      • #4
        Hallo Defo,

        ja, über sqlplus.

        dachte bisher an sowas

        [highlight=sql]
        select SUBSTR (SYS_CONNECT_BY_PATH (stati , ','), 2) CSV
        from (select stati , ROW_NUMBER () over (order by stati ) RN,
        COUNT (*) OVER () cnt
        FROM test )
        where RN = CNT
        START WITH rn = 1
        connect by RN = prior RN + 1
        ;

        [/highlight]

        Mir fällt aber nichts ein, wie ich es über die id gruppieren könnte

        Gruß

        Martin

        Comment


        • #5
          Originally posted by Falk Prüfer View Post
          Hallo,

          [offtopic]

          Nur weils mir grad auffällt... Die Mehrzahl des Status ist die Status (mit langem u) oder die Statusse, niemals jedoch Stati .
          [/offtopic]

          Gruß Falk
          Hallo Falk,

          Vielen Dank für deine schnelle Hilfe!

          Gruß

          Martin

          Comment


          • #6
            Also geht's Dir nicht um das Exportproblem, sondern die Query?
            Wenn ja, und wenn das Tabellenformat egal ist, was ist denn das Datenmodell der "Rohdaten"?
            Zuletzt editiert von defo; 20.04.2012, 14:33. Reason: Schnarch
            Gruß, defo

            Comment


            • #7
              Originally posted by defo View Post
              Also geht's Dir nicht um das Exportproblem, sondern die Query?
              Wenn ja, und wenn das Tabellenformat egal ist, was ist denn das Datenmodell der "Rohdaten"?
              ja, ob ich dann die Query im Spool oder auf tabellenebene anwende ist egal.

              Die Rohdaten bekommen wir als csv mit einigen Lücken. Nach dem Laden lassen wir diese gegen die Stammdaten verschiedener DBs laufen und prüfen einiges ab.

              Anschliessend werden die Daten von uns aktualisiert/eingefügt, wieder gespoolt und versendet.
              Einfluss auf die Satzartbeschreibungen der csvn haben wir nicht.

              Gruß´

              Martin

              Comment


              • #8
                Äh, also ich bin mir nicht sicher, ob ich das kapiert hab. Die "Rohdaten" = "Ausgangsdaten für das folgende Select " liegen also denormalisiert vor:
                1;meier;Müller;S1
                1;meier;Müller;S3
                1;meier;Müller;S7

                Dann wäre Dein Select mit SYS_CONNECT_BY_PATH
                etwa sowas:
                [highlight=sql] select id, max(sys_connect_by_path(stati, ',')) csv
                from (select id, stati,
                row_number() over(partition by id order by stati) rn
                from test1)
                start with rn = 1
                connect by prior rn = rn - 1
                and prior id = id
                group by id
                order by id[/highlight]

                Hier findest Du eine ganze Reihe von Verfahren, die u.U. transparenter und evtl. schneller/robuster sind. Nicht zu vergessen das alte >rowtocol
                http://www.dba-oracle.com/t_converting_rows_columns.htm
                Gruß, defo

                Comment


                • #9
                  Originally posted by defo View Post
                  Äh, also ich bin mir nicht sicher, ob ich das kapiert hab. Die "Rohdaten" = "Ausgangsdaten für das folgende Select " liegen also denormalisiert vor:
                  1;meier;Müller;S1
                  1;meier;Müller;S3
                  1;meier;Müller;S7

                  Dann wäre Dein Select mit SYS_CONNECT_BY_PATH
                  etwa sowas:
                  [highlight=sql] select id, max(sys_connect_by_path(stati, ',')) csv
                  from (select id, stati,
                  row_number() over(partition by id order by stati) rn
                  from test1)
                  start with rn = 1
                  connect by prior rn = rn - 1
                  and prior id = id
                  group by id
                  order by id[/highlight]

                  Hier findest Du eine ganze Reihe von Verfahren, die u.U. transparenter und evtl. schneller/robuster sind. Nicht zu vergessen das alte >rowtocol
                  http://www.dba-oracle.com/t_converting_rows_columns.htm
                  hallo Defo,

                  erstmals vielen dank!

                  In etwa ja, die Status(danke an falk;-) ermitteln wir selbst und werden ihn je nachdem, wie es für uns am besten ist speichern.

                  Ob und wenn, in wie weit wir normalisieren wissen wir noch nicht.
                  Wir haben noch keine Ahnung, um wieviel daten es sich handeln wird.

                  Bei Deinem selcet bekommt man leider auch, wie in meinen, umständlicher als Deinen Ideen ein führendes Komma.

                  danke Dir

                  Gruss

                  Martin

                  Comment


                  • #10
                    "..wie in meinen, umständlicher als Deinen Ideen.."
                    Hab ich nicht verstanden.

                    Komma würd ich vlt in einer Schicht darüber abknipsen.
                    Mit einer Stored Function ala rowtocol, kann man das ggF direkt inline erledigen.
                    Evtl. kann man noch an start with drehen und das führende Komma fliegt raus...
                    Oder mal die XML Aggregate Variante versuchen.
                    Gruß, defo

                    Comment


                    • #11
                      Hallo Defo,

                      sorry für die späte Rückmeldung.
                      Meine Idee der Umsetzung war komplizierter( weniger performant) als die Deine!

                      Vielen Dank für Deine Hilfe!

                      Viele Grüße

                      Martin

                      Comment


                      • #12
                        Was hast du denn nun genommen, sys_connect_by_path oder etwas aus dem Link?
                        Rückmeldungen sind ja nicht unbedingt Standard, also lieber spät als nie.
                        Gruß, defo

                        Comment


                        • #13
                          Hi Defo,

                          ich wählte u.a. Lösung.

                          [highlight=sql]
                          WITH data AS
                          ( SELECT '2' pers, '3' status FROM DUAL
                          UNION ALL
                          SELECT'1' ,'6'FROM DUAL
                          UNION ALL
                          SELECT'1', '8'FROM DUAL
                          UNION ALL
                          SELECT'1' , '5'FROM DUAL
                          UNION ALL
                          SELECT'2' , '3'FROM DUAL
                          UNION ALL
                          SELECT'3' , '1'FROM DUAL
                          UNION ALL
                          SELECT'4 ' , '9 'FROM DUAL
                          )
                          SELECT pers,
                          SUBSTR(SYS_CONNECT_BY_PATH(status, ','),2) status
                          FROM
                          (SELECT status,
                          pers,
                          COUNT(*) OVER ( partition BY pers ) cnt,
                          ROW_NUMBER () OVER ( partition BY pers order by status) seq
                          FROM data
                          WHERE pers IS NOT NULL
                          )
                          WHERE seq =cnt
                          START WITH seq =1
                          CONNECT BY prior seq+1=seq
                          AND prior pers =pers;

                          [/highlight]

                          Viele Grüße

                          Martin

                          Comment

                          Working...
                          X