Announcement

Collapse
No announcement yet.

Kompliziertere Abfrage in VBA (Excel) für Oracle erstellen (Kreuztabelle)

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

  • Kompliziertere Abfrage in VBA (Excel) für Oracle erstellen (Kreuztabelle)

    Hallo,

    Vereinfacht habe ich eine Oracle-Tabelle (nennen wir sie X) auf einem Server. Auf diese wird mittels ODBC von Access und Excel aus zugegriffen.

    Die Tabelle sieht wie folgt aus:

    Tabelle X:
    Code:
    DATE|INSTR|VALUE
    ----------------
    a   |1    |a1
    a   |2    |a2
    a   |3    |a3
    a   |4    |a4
    b   |1    |b1
    b   |2    |b2
    b   |3    |b3
    b   |4    |b4
    Also am Tag a habe ich 4 Instrumente mit einem jeweiligen individuellen Wert (genauso am Tag b, usw...)

    Die originale Tabelle ist natürlich viel größer und mit folgender ABfrage kann ich mir in Excel problemlos ein Teilergebnis herausholen:

    [highlight=sql]SELECT X.DATE, X.INSTR, X.VALUE
    FROM X
    WHERE ((X.Date >= datumsparameter) AND X.INSTR in (1,2))
    ORDER BY X.DATE[/highlight]

    Ergebnis:
    Im Prinzip ein Auszug der obigen Tabelle nun gefiltert für Instrument 1 und 2, nur das alles in einer Wurscht aufgelistet wird. Also ich für jeden Tage mehrere Zeilen benötige.

    Was ich möchte, ist dass das Ergebnis nach Tagen gruppiert (Zeilen) wird und jeweils eine Spalte pro Instrument verwendert wird - also dann in etwa so aussieht:

    Code:
    DATE|1   |2   
    ---------------
    a   |a1  |a2
    b   |b1  |b2
    Wie muss ein solche Abfrage in Excel-VBA aussehen?

    In Access ist so eine Abfrage leicht erstellt:
    [highlight=SQL]TRANSFORM Last(X.VALUE) AS LetzterWertvonVALUE
    SELECT X.DATE
    FROM X
    WHERE ((X.DATE >= datumsparameter) AND (X.INSTR in (1,2))
    GROUP BY X.DATE
    ORDER BY X.DATE
    PIVOT X.INSTR[/highlight]

    Im Normalfall kann man ja die Access-Abfragen 1:1 in Excel übernehmen, aber scheinbar kann Excel mit dem TRANSFORM...PIVOT Befehl nicht umgehen, oder besser gesagt kenne ich mich damit zuwenig aus

    Wer kann mir da weiterhelfen?
    Zuletzt editiert von BURN; 05.03.2008, 10:21.

  • #2
    Access hat eine eigene SQL-Engine und kann damit selbst die SQL-Abfragen durchführen. Excel leidet die SQL-Abfragen and die eigentliche DB durch. Damit mußt du die SQL-Syntax der DB (hier Oracle) verwenden. Es ist nur verwunderlich das du noch nicht viel früher auf Probleme wegen unterschiedlicher SQL-Syntax gestoßen bist. Google einfach mal nach "pivot oracle" um entsprechende Syntaxbeispiele für Oracle zu bekommen.

    Comment


    • #3
      @Bernhard:
      Danke für den Suchhinweis - mal sehen, ob ich da was Brauchbares finde

      Natürlich ist es nicht immer 1:1, aber die bisherigen Probleme konnte ich mit Google jedes Mal noch relativ schnell lösen, diesmal haben meine Suchanfragen (dürften nicht konkret genug gewesen sein) aber nicht zum gewünschten Erfolg geführt...

      Comment


      • #4
        Mit dieser Seite dürfte ich genau das gefunden haben, wonach ich gesucht habe:
        http://www.adp-gmbh.ch/ora/sql/examples/pivot.html

        Bei der Umsetzung (ich brauche es dann in der Praxis doch etwas komplizierter), plagt mich die Fehlermeldung

        ORA-00933: SQL command not properly ended

        Im Moment weiß ich einfach nicht mehr, woran es liegen kann, aber es dürfte sich um ein VBA Probelm handeln, da meine Abfrage mit dem Programm Oracle SQL*Plus funktioniert:

        Oracle SQL*Plus:
        [highlight=sql]
        SELECT DATUM, INSTR1, INSTR2
        FROM
        (SELECT X.REP_ID, X.DATE, X.PART, X.INSTR,
        max(CASE WHEN X.INSTR in (1,26) THEN X.DATE else NULL END) DATUM,
        max(CASE WHEN X.INSTR = 1 THEN X.VALUE else NULL END) INSTR1,
        max(CASE WHEN X.INSTR = 26 THEN X.Value else NULL END) INSTR2
        FROM X
        WHERE (((X.REP_ID) = 'abcd')
        AND ((X.DATE) >= '01-FEB-2008')
        AND ((X.PART = 0)))
        GROUP BY X.DATE)
        ORDER BY DATUM;
        [/highlight]

        Im Vergleich dazu dieselbe Abfrage in VBA (die mir oben genannte Fehlermeldung liefert):
        Code:
        SQL = "SELECT DATUM, INSTR1, INSTR2 " _
        & "FROM " _
        & "(SELECT X.REP_ID, X.DATE, X.PART, X.INSTR, " _
        & "max(CASE when X.INSTR in (1,26) then X.DATE else NULL END) DATUM, " _
        & "max(CASE when X.INSTR = 1 then X.VALUE else NULL END) INSTR1, " _
        & "max(CASE when X.INSTR = 26 then X.VALUE else NULL END) INSTR2 " _
        & "FROM X " _
        & "WHERE (((X.REP_ID) = " & "'" & pfname & "'" & ") " _
        & "And ((X.DATE) >= " & "'" & datum1 & "'" & ") " _
        & "And ((X.PART) = 0))) " _
        & "GROUP BY X.DATE) " _
        & "ORDER BY DATUM"

        Wie gesagt, habe keine Idee, wo hier der Fehler liegt...
        Zuletzt editiert von BURN; 07.03.2008, 11:58. Reason: Die 'Klammer zu', welche zuviel ist, rot markiert...

        Comment


        • #5
          OK, Alles Klar - War eine 'Klammer zu' zuviel dabei - bei sowas kann man manchmal ewig suchen - Auf alle Fälle funktioniert jetzt alles so wie es soll!!

          (Ich habe die Klammer im obigen Post rot markiert)

          Comment

          Working...
          X