Announcement

Collapse
No announcement yet.

Zeile in Spalte

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

  • Zeile in Spalte

    Hallo Zusammen,

    habe folgendes Problem und komme da nicht drauf.
    Ich versuche ähnlich wie in u.a. Beispiel Zeilen in eine Spalte zu bringen.
    HTML Code:
    WITH data AS
      ( SELECT '2' bpnr, '13' status FROM DUAL
      UNION ALL
      SELECT'1' ,'10'FROM DUAL
      UNION ALL
      SELECT'1', '11'FROM DUAL
      UNION ALL
      SELECT'1' , '12'FROM DUAL
      UNION ALL
      SELECT'2' , '10'FROM DUAL
      UNION ALL
      SELECT'3' , '10'FROM DUAL
      UNION ALL
      SELECT'4 ' , '11 'FROM DUAL
      )
    SELECT bpnr,
      SUBSTR(SYS_CONNECT_BY_PATH(status, ','),2) status
    FROM
      (SELECT status,
        bpnr,
        COUNT(*) OVER ( partition BY bpnr ) cnt,
        ROW_NUMBER () OVER ( partition BY bpnr order by status) seq
      FROM data
      WHERE bpnr IS NOT NULL
      )
    WHERE seq               =cnt
      START WITH seq        =1
      CONNECT BY prior seq+1=seq
    AND prior bpnr          =bpnr;

    Nun hätte ich es aber gerne so, dass nur die Werte aus der Spalte in eine Zeile kommen, wenn Test und BPNR identisch bleiben. Test und BPNR sollen in einzelnen Spalten verbleiben, der Staus in einer.

    U.a. soll Euch nur das Tippen abnehmen

    Code:
    WITH data AS
      ( SELECT '2' bpnr, '13' status, '13' test FROM DUAL
      UNION ALL
      SELECT'1' ,'10', '13'FROM DUAL
      UNION ALL
      SELECT'1', '11', '12' FROM DUAL
      UNION ALL
      SELECT'1' , '12', '13' FROM DUAL
      UNION ALL
      SELECT'2' , '10' , '13'FROM DUAL
      UNION ALL
      SELECT'3' , '10', '13'FROM DUAL
      UNION ALL
      SELECT'4 ' , '11','10'FROM DUAL
      )
    Vielen Dank, schon mal

    Viele Grüße

    Martin

  • #2
    Hallo noch mal,

    als Ergänzung.

    Die Spalte test sei nur exemplarisch für x Spalten.

    Also


    WITH data AS
    ( SELECT '2' bpnr, '13' status, '13' '1' Spalte2,'1' Spalte2 Spalte1FROM DUAL
    UNION ALL
    SELECT'1' ,'10', '13' ,'1' FROM DUAL
    UNION ALL
    SELECT'1', '11', '12','2' FROM DUAL
    UNION ALL
    SELECT'1' , '12', '13','1' FROM DUAL
    UNION ALL
    SELECT'2' , '10' , '13','2' FROM DUAL
    UNION ALL
    SELECT'3' , '10', '13' ,'2' FROM DUAL
    UNION ALL
    SELECT'4 ' , '11','10' ,'1' FROM DUAL
    )


    Danke noch mal!

    Gruß

    Martin

    Comment


    • #3
      Ich hab Deine Anforderung nicht verstehen können.
      Dein 2. Post, der sicher etwas verdeutlichen soll, funktioniert nicht und mir ist auch unklar, was gerade die erste Abfrage im Unionteil darstellen soll.

      Wie wär es neben einem funktionierenden Statement mit Ausgangswerten noch mit den daraus von Dir vorgesehenen Ergebniswerten?

      Ansonsten ein paar Alternativen zu der ConnectByPath Variante:
      Es gibt seit langem die Funktion rowtocolumn in verschiedenen Varianten, die sich immerhin bequem verwenden lässt, ,mittlerweile aber auch Varianten, die Pivot Funktionen nutzen oder XML Funktionen.
      Mittlerweile ist dabei relativ, da ich da ungefähr auf Stand Oracle 11 bin.
      Gruß, defo

      Comment


      • #4
        Hallo Defo,

        versuche es mal zu verdeutlichen, kam mir schon gestern so vor, als ob ich mich nicht wirklich verständlich machen konnten.

        sagen.
        Aus

        WITH data AS
        ( SELECT '2' bpnr, '13' Spalte1, '1' Spalte2, 'a' status FROM DUAL
        UNION ALL
        SELECT'1' ,'12', '11' ,'b' FROM DUAL
        UNION ALL
        SELECT'1', '11', '12','c' FROM DUAL
        UNION ALL
        SELECT'1' , '12', '11','d' FROM DUAL
        UNION ALL
        SELECT'2' , '10' , '13','e' FROM DUAL
        UNION ALL
        SELECT'1' , '10', '13' ,'f' FROM DUAL
        UNION ALL
        SELECT'2 ' , '10','13' ,'g' FROM DUAL
        )
        select * from data order by 1,3,4;


        soll

        WITH data AS
        ( SELECT '1' bpnr, '12' Spalte1, '11' Spalte2, 'a;d' status FROM DUAL
        UNION ALL
        SELECT'2' , '13' , '11','4' FROM DUAL
        UNION ALL
        SELECT'1' , '10', '13' ,'f' FROM DUAL
        UNION ALL
        SELECT'2 ' , '10','13' ,'e;g' FROM DUAL
        )
        select * from data order by 1,3,4;



        werden.

        Das bedeutet solange Die Spalten,BPNR,Spalte1 und Spalte zwei sich nicht ändern werden die unterschiedlichen Status im Feld Status Kommasepariert aufgelistet.
        Ändert sich etwas an einer der drei Spalten, soll eine neue Zeile erzeugt werden.

        Hoffe war jetzt verständlicher.

        Sorry für Post Nr. 2, habe mich verschrieben.

        Viele Grüße

        Martin

        Comment


        • #5
          Hallo Defo,

          kaum ist man etwas wacher


          WITH data AS
          ( SELECT '2' bpnr, '13' Spalte1, '1' Spalte2, 'a' status FROM DUAL
          UNION ALL
          SELECT'1' ,'12', '11' ,'b' FROM DUAL
          UNION ALL
          SELECT'1', '11', '12','c' FROM DUAL
          UNION ALL
          SELECT'1' , '12', '11','d' FROM DUAL
          UNION ALL
          SELECT'2' , '10' , '13','e' FROM DUAL
          UNION ALL
          SELECT'1' , '10', '13' ,'f' FROM DUAL
          UNION ALL
          SELECT'2' , '10','13' ,'g' FROM DUAL
          )
          select
          bpnr,spalte1,spalte2,
          listagg (status, ',')
          WITHIN GROUP
          (ORDER BY status) status
          FROM
          data
          GROUP BY
          bpnr,spalte1,spalte2;



          sowas sollte das werden

          Danke dir sehr

          Viele Grüße

          Martin

          Comment

          Working...
          X