Announcement

Collapse
No announcement yet.

Pivot in oracle

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

  • Pivot in oracle

    Hallo zusammen,

    Ich suche nach einer pivot-adäquaten Funktion in oracle. Ich habe schon einiges gefunden...ist aber alles viel zu schwer (in mssql ist das doch sooo einfach?). Ich will werte in einer Spalte eifach in einer Zeile ausgeben....ist das so schwer oder bin ich einfach besoffen ?


    Wäre sehr dankbar wenn mir jemand helfen könnte.....

    edit: Die Lösung MUSS ohne cursor (und so PLSQL Zeugs sein...)


    Herzlichen Dank und Gruss

    Cakl

  • #2
    Für welche ORACLE-Version ?

    Comment


    • #3
      logischerweise nicht für 11g *heul*

      sorry das ich das nicht geschrieben habe. des war echt dumm von mir!

      Comment


      • #4
        Mein Beispiel:

        Kid | Pid
        23 | 70
        23 | 90
        23 | 200

        sollte dann so aussehen:

        23 | 70 | 90 | 200

        das nennt man doch pivotisieren oder ?

        Comment


        • #5
          Die typischen Verfahren laufen dann über Rowgeneratoren oder das undokumentierte wm_concat (falls das Schema WMSYS installiert wurde), Beispiel:
          Code:
          select wm_concat(table_name) from user_tables where rownum<10

          Comment


          • #6
            Originally posted by jum View Post
            Die typischen Verfahren laufen dann über Rowgeneratoren oder das undokumentierte wm_concat (falls das Schema WMSYS installiert wurde), Beispiel:
            Code:
            select wm_concat(table_name) from user_tables where rownum<10

            Danke für die Antwort... aber das Schema ist anscheinend nicht installiert...gibts keine andere Lösung ?

            Ich hab jetzt schon oft diese Lösung mit with as.. gesehen...verstehe sie aber überhaupt nicht und zweifle auch daran ob sie 100% dymisch ist!

            MSSQL ist das standart und oracle braucht 10versionen um das einzubauen....?!
            Zuletzt editiert von cakl; 02.02.2009, 17:49.

            Comment


            • #7
              Die Hintergründe sind ziemlich gut erklärt in:
              http://www.orafaq.com/node/1871
              Tatsächlich wird das in den Foren andauernd nachgefragt, es gibt keinen einfachen aber "volldynamischen" Königsweg, sondern nur für bestimmte Fälle...
              Daher auch die Erweiterung in 11g.

              Comment


              • #8
                Originally posted by jum View Post
                Die Hintergründe sind ziemlich gut erklärt in:
                http://www.orafaq.com/node/1871
                Tatsächlich wird das in den Foren andauernd nachgefragt, es gibt keinen einfachen aber "volldynamischen" Königsweg, sondern nur für bestimmte Fälle...
                Daher auch die Erweiterung in 11g.
                HI,

                Ein Lösung wäre auch :

                Code:
                select
                   deptno,
                   xmltransform
                   (
                      sys_xmlagg
                      (
                         sys_xmlgen(ename)
                      ),
                     xmltype
                     (
                       '<?xml version="1.0"?><xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                          <xsl:template match="/">
                            <xsl:for-each select="/ROWSET/ENAME">
                              <xsl:value-of select="text()"/>;</xsl:for-each>
                          </xsl:template>
                        </xsl:stylesheet>'
                     )
                  ).getstringval() listagg
                from scott.emp
                group by deptno;
                - Funktioniert ab 9iR2
                - Basiert auf Scott /Tiger Beispielschema
                - Ergibt folgendes Resultat :

                Code:
                1	10	CLARK;KING;MILLER;                   
                2	20	SMITH;FORD;ADAMS;SCOTT;JONES;        
                3	30	ALLEN;BLAKE;MARTIN;TURNER;JAMES;WARD;

                Gruss

                Comment


                • #9
                  Solche Beiträge sollte man eigentlich oben anheften.

                  Dim
                  Zitat Tom Kyte:
                  I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

                  Comment


                  • #10
                    Herzlichenk Dank für die Bemühungen.

                    Comment


                    • #11
                      Ganz konkret mit Deinem Schema geht ebenfalls in 9i
                      Code:
                      WITH a AS
                           (  SELECT 23 kid, 50 pid   FROM DUAL
                              UNION ALL
                              SELECT 23, 70           FROM DUAL
                              UNION ALL
                              SELECT 23, 90           FROM DUAL
                              UNION ALL
                              SELECT 23, 200          FROM DUAL
                              UNION ALL
                              SELECT 31, 120          FROM DUAL
                              UNION ALL
                              SELECT 31, 170          FROM DUAL)
                      SELECT  kid, SYS_CONNECT_BY_PATH(pid, '|') pivo
                              FROM ( SELECT ROW_NUMBER() OVER(PARTITION BY kid ORDER BY pid) rn,
                                            COUNT(*) OVER(PARTITION BY kid) tot, kid, pid
                                     FROM a)
                           WHERE rn = tot
                      START WITH rn = 1
                      CONNECT BY PRIOR rn = rn - 1 AND PRIOR kid = kid;
                      ergibt:
                      Code:
                      KID	PIVO
                      23	|50|70|90|200
                      31	|120|170
                      Zuletzt editiert von jum; 03.02.2009, 09:25.

                      Comment

                      Working...
                      X