Kreutztabellenabfrage / Pivot

08/04/2009 - 17:05 von Stefan Theobald | Report spam
Hallo,

in meinem Programm rufe ich Daten aus einer Progress-DB via ODBC ab und
fülle diese Daten in eine DataTable und die durchlaufe ich wiederrum um die
Daten in ein XML Format zu bringen.
Das ganze funktioniert auch seit einiger Zeit, ist nur finde ich sehr
langsam. Lauf für knapp 300 Datensàtze ca 20Min.

Das Problem ist, dass zu den Hauptdaten noch Daten für Varianten gezogen
werden und die Datenstruktur etwas dümmlich ist, so dass ich die
Pivot-Funktion / Kreutztabellenabfrage benötigen würde.

Im ACCESS habe ich meine Tabelle via ODBC verknüpft und kann auch eine
Abfrage erstellen - nur kann ich diese dort nicht direkt als Krutztabelle
machen. Muss immer mit dem Assistent auf die bestehende Abfrage gehen und
dann daraus wieder eine Kreutztabellenabfrage.

Binde ich direkt ein, meckert er im SELECT die HAVING-Klausel an.
Wie kann man das umgehen?

Meine Idee wàhre nun halt über ACCESS zu gehen, da es hier auch das First /
Last gibt, das ich auch brauche und dann eine die Kreutztabellenabfrage
(sofern ich die so hinbekomme) als Tabellenerstellungsabfrage zu machen.
Auf diese Tabelle würde ich dann wieder gehen und die Haupt und Varianten
rausselektieren und dann in XML umfomen.

Meint ihr, dass das schneller wird?

Hat einer schon mal eine Abfrage direkt in eine Kreutztabellenabfrage
gemacht und daraus eine Erstellungsabfrage?
Wird die Tabelle auch im VB ohne Probleme beim nàchsten Programmlauf
überschrieben / neu erstellt - falls ein neues Merkmal (Spalte) dazu kommt?



Gruß
Stefan
 

Lesen sie die antworten

#1 Peter Doering
09/04/2009 - 14:58 | Warnen spam
Hallo,

Meine Antwort gilt fuer die Fragen, die sich auf Access beziehen:

Stefan Theobald wrote:
[...]
Im ACCESS habe ich meine Tabelle via ODBC verknüpft und kann auch eine
Abfrage erstellen - nur kann ich diese dort nicht direkt als Krutztabelle
machen. Muss immer mit dem Assistent auf die bestehende Abfrage gehen und
dann daraus wieder eine Kreutztabellenabfrage.



?

Den Assistenten startest du auf eigenen Wunsch. Ansonsten kannst du die
Kreuztabelle direkt im SQL-Fenster eingeben:

TRANSFORM Sum(Irgendwas) AS DatenFeld
SELECT ReihenFeld1, ReihenFeld2, ...
FROM Tab1
WHERE <wasauchimmer>
GROUP BY ReihenFeld1, ReihenFeld2
PIVOT SpaltenFeld

Wenn du feste Spalten brauchst, kommt als letztes noch die In-Klausel dazu:

IN ('Jan', 'Feb', 'Mar', ...)

Binde ich direkt ein, meckert er im SELECT die HAVING-Klausel an.
Wie kann man das umgehen?



HAVING steht nach GROUP BY und bezieht sich auf aggrigierte Felder, z.B.
HAVING Sum(Feld1)> 0, also was in WHERE noch nicht verfuegbar ist. Alles
andere gehoert nach WHERE. Wenn das nicht hilft, zeig mal deinen
SQL-String.

Meine Idee wàhre nun halt über ACCESS zu gehen, da es hier auch das First /
Last gibt,



Wozu brauchst du das denn? First/Last geben den ersten/letzten DS in
Reihenfolge der Eintragung zurueck, z.B. bei 5->1->9->3 => 5 u. 3, sehr
sinnvoll ;-)

AFAIK gibt's die nur in Access und sind auch geaechtet. Sie werden auch
gerne mit Min/Max verwechselt.

das ich auch brauche und dann eine die Kreutztabellenabfrage
(sofern ich die so hinbekomme) als Tabellenerstellungsabfrage zu machen.



Ok, Kreuztabelle gleichzeitig als Erstellungsabfrage geht nicht. Dafuer
brauchst du eine zweite Abfrage:

SELECT * INTO NeueTab FROM PivotAbfrage

Auf diese Tabelle würde ich dann wieder gehen und die Haupt und Varianten
rausselektieren und dann in XML umfomen.



Wenn du schon mit Access arbeitest, kannst du auch die Onboard-Funktion
ExportXML nutzen. Dabei wird der Objektname, also in deinem Fall der Name
der Abfrage als XML-Tag verwendet.

Application.ExportXML acExportTable, "NeueTab", "C:\Temp\Deine.xml"

(Rest siehe OH)

Das geht auch fuer Abfragen, d.h. die Ausgabe in eine Tabelle koenntest du
dir sparen.

Meint ihr, dass das schneller wird?



ExportXML ist richtig schnell (1 MB/sec gefuehlt), die Ausgabe aber relativ
unflexibel. Wenn das Format ausreicht, kommt Freude auf. Jeder(?)
XML-Parser versteht das Format.

Hat einer schon mal eine Abfrage direkt in eine Kreutztabellenabfrage
gemacht und daraus eine Erstellungsabfrage?



Nein, geht nicht, s.o.

Wird die Tabelle auch im VB ohne Probleme beim nàchsten Programmlauf
überschrieben / neu erstellt - falls ein neues Merkmal (Spalte) dazu kommt?



Kommt auf die verwendete Methode an. Manche ueberschreiben nicht, sondern
bilden einen neuen Namen, z.B. 'NeueTab1'. Du kannst ggf. die Tabelle
vorher loeschen:

Pruefen, ob vorhanden:
SELECT Count(*)
FROM MSysObjects
WHERE [Name] = 'NeueTab' AND [Type] In (1, 4, 5)

Loeschen ueber DROP TABLE 'NeueTab'

Gruss - Peter

Peter Doering [MVP Access]

Ähnliche fragen