{"id":55000846,"date":"2012-08-01T00:00:00","date_gmt":"2020-05-22T21:47:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=846"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"KreuztabellenAbfragen_mit_Kriterien","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/","title":{"rendered":"Kreuztabellen-Abfragen mit Kriterien"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Kreuztabellen-Abfragen erlauben die Gruppierung von Daten nach zwei Kriterien, die als Spalten- und Zeilenk&ouml;pfe dargestellt werden. Solange Sie eine solche Abfrage manuell und statisch erstellen, k&ouml;nnen Sie diese mit aussagekr&auml;ftigen Spalten&uuml;berschriften versehen. Sobald die Daten jedoch etwa per Parameter gefiltert werden sollen, wird es kompliziert, denn auch die Spalten&uuml;berschriften m&uuml;ssen dann dynamisch angepasst werden. Dieser Beitrag zeigt M&ouml;glichkeiten, dieses Problem zu l&ouml;sen.<\/b><\/p>\n<p>Wenn Sie eine Kreuztabelle aufbauen, welche die Ums&auml;tze f&uuml;r alle Kunden nach Monaten gruppieren und summieren soll, legen Sie f&uuml;r die Spalten&uuml;berschriften der Kreuztabellen-Abfrage einen Ausdruck wie den folgenden fest:<\/p>\n<pre>Bestellung: Monat([Bestelldatum]) &amp; &quot;\/&quot; &amp; Jahr([Bestelldatum])<\/pre>\n<p>Dies f&uuml;hrt im Ergebnis zwar zur korrekten Anzeige der Spalten&uuml;berschriften (s. Bild 1).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Kreuztabellen-Abfrage mit unsortierten Spalten&uuml;berschriften<\/span><\/b><\/p>\n<p>Allerdings werden die &Uuml;berschriften alphabetisch sortiert und nicht nach Jahr und Monat, wie es eigentlich sein sollte.<\/p>\n<p>Nun: Wir haben es der Kreuztabellen-Abfrage ja auch nicht mitgeteilt. Dies erledigen Sie, indem Sie f&uuml;r die Eigenschaft <b>Fixierte Spalten&uuml;berschriften <\/b>einen Ausdruck wie den folgenden eintragen (s. Bild 2):<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Entwurf der Kreuztabellen-Abfrage mit fixierten Spalten&uuml;berschriften<\/span><\/b><\/p>\n<pre>&quot;7\/2011&quot;;&quot;8\/2011&quot;;&quot;9\/2011&quot;;...<\/pre>\n<p>Das Ergebnis stellt uns zun&auml;chst zufrieden, denn die Spalten&uuml;berschriften werden nun nach Jahr und Monat sortiert (s. Bild 3).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Kreuztabelle mit korrekt sortierten Spalten&uuml;berschriften<\/span><\/b><\/p>\n<p>Dabei m&uuml;ssen Sie darauf achten, dass Sie die Spalten&uuml;berschriften den tats&auml;chlich vorhandenen Daten anpassen. Wenn Sie also Daten von <b>1\/2012 <\/b>bis <b>12\/2012 <\/b>anzeigen und Spalten&uuml;berschriften f&uuml;r die Monate <b>7\/2012 <\/b>bis <b>7\/2013 <\/b>angeben, dann werden zwar die Spalten f&uuml;r <b>7\/2012 <\/b>bis <b>6\/2013 <\/b>angezeigt, aber es sind nur die Spalten <b>1\/2012 <\/b>bis <b>6\/2012 <\/b>mit Daten gef&uuml;llt. Die &uuml;brigen Spalten bleiben leer, weil ja aufgrund des Filterkriteriums keine Daten vorliegen. Dies macht auch deutlich, dass die Spalten&uuml;berschriften ungeachtet der enthaltenen Daten angelegt werden.<\/p>\n<p>Wie aber erhalten wir nun sortierte Spalten&uuml;berschriften f&uuml;r beliebig gefilterte Daten<\/p>\n<p>Die erste M&ouml;glichkeit ist es, den Ausdruck f&uuml;r die Spalten&uuml;berschriften so anzupassen, dass er trotz alphabetischer Sortierung die richtige Reihenfolge liefert. Dazu muss das Jahr nach vorn gestellt werden und der Monat immer mit zwei Stellen angezeigt werden. Der Ausdruck f&uuml;r die Spalten&uuml;berschriften sieht dann so aus:<\/p>\n<pre>Bestellung: Jahr([Bestelldatum]) &amp; &quot;\/&quot;\r\n&amp; Format(Monat([Bestelldatum]);&quot;00&quot;)<\/pre>\n<p>Das Ergebnis finden Sie in Bild 4. Die Abfrage zeigt die Spalten&uuml;berschriften nun in der richtigen Reihenfolge an. Allerdings k&ouml;nnte ein Kunde damit unzufrieden sein, weil er sich h&ouml;chste Perfektion w&uuml;nscht. Und wenn Sie, wie ich, dem Kunden immer mitteilen, dass man mit Access praktisch jede Anforderung erf&uuml;llen kann, m&ouml;chten Sie vielleicht wissen, wie dieses Problem gel&ouml;st wird.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Richtig sortierte Spalten&uuml;berschriften, allerdings im Format yyyy\/mm<\/span><\/b><\/p>\n<p><b>Basis-Abfrage<\/b><\/p>\n<p>Um gleich einen &uuml;berschaubareren SQL-Ausdruck zu erhalten, erstellen Sie zun&auml;chst eine Basis-Abfrage, die alle ben&ouml;tigten Daten f&uuml;r die Kreuztabellen in einer Abfrage zusammenfasst.<\/p>\n<p>Diese sieht wie in Bild 5 aus und enth&auml;lt die Felder <b>KundeID<\/b>, <b>Firma <\/b>der Tabelle <b>tblKunden<\/b>, das Feld <b>Bestelldatum <\/b>der Tabelle <b>tblBestellungen <\/b>sowie einen Ausdruck zur Berechnung des Umsatzes auf Basis der Felder <b>Einzelpreis<\/b>, <b>Anzahl <\/b>und <b>Rabatt <\/b>der Tabelle <b>tblBestelldetails<\/b>:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Basisabfrage f&uuml;r die Kreuztabelle<\/span><\/b><\/p>\n<pre>Umsatz: [Einzelpreis]*[Anzahl]\r\n*(1-ZCurrency([Rabatt]))<\/pre>\n<p>Auf Basis dieser Abfrage erstellen wir die Kreuztabellen-Abfrage. Legen Sie eine neue Abfrage an und f&uuml;gen Sie die Abfrage <b>qryUmsaetzeNachKundeUndMonat_Base <\/b>als Datenherkunft hinzu.<\/p>\n<p>Wandeln Sie die Abfrage in der Entwurfsansicht mit dem Kontextmen&uuml;eintrag <b>Abfragetyp|Kreuztabellen-Abfrage<\/b> in eine Kreuztabelle um. F&uuml;gen Sie alle Felder der Datenherkunft zum Entwurfsraster hinzu. Das Feld <b>Bestelldatum <\/b>ersetzen Sie durch den folgenden Ausdruck:<\/p>\n<pre>Bestellung: Monat([Bestelldatum]) &amp; &quot;\/&quot; &amp; Jahr([Bestelldatum])<\/pre>\n<p>Danach stellen Sie den Wert in der Zeile <b>Kreuztabelle<\/b> f&uuml;r die einzelnen Felder wie folgt ein:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>KundeID <\/b>und <b>Firma<\/b>: <b>Zeilen&uuml;berschrift<\/b><\/li>\n<li class=\"aufz-hlung\"><b>Bestellung<\/b>: <b>Spalten&uuml;berschrift<\/b><\/li>\n<li class=\"aufz-hlung\"><b>Umsatz<\/b>: <b>Wert <\/b>(hier stellen Sie au&szlig;erdem den Wert in der Zeile <b>Funktion <\/b>auf <b>Summe <\/b>ein)<\/li>\n<\/ul>\n<p><!--30percent--><\/p>\n<p>Die Abfrage sieht nun wie in Bild 6 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: Aufbau der Kreuztabelle<\/span><\/b><\/p>\n<p>Geben Sie dann diesen Ausdruck als Wert der Eigenschaft <b>Fixierte Spalten&uuml;berschriften <\/b>ein:<\/p>\n<p>&quot;7\/2011&quot;;&quot;8\/2011&quot;;&quot;9\/2011&quot;;&quot;10\/2011&quot;;&quot;11\/2011&quot;;&quot;12\/2011&quot;;&quot;1\/2012&quot;;&quot;2\/2012&quot;;&quot;3\/2012&quot;;&quot;4\/2012&quot;;&quot;5\/2012&quot;;&quot;6\/2012&quot;;&quot;7\/2012&quot;;&quot;8\/2012&quot;;&quot;9\/2012&quot;;&quot;10\/2012&quot;;&quot;11\/2012&quot;;&quot;12\/2012&quot;;&quot;1\/2013&quot;;&quot;2\/2013&quot;;&quot;3\/2013&quot;;&quot;4\/2013&quot;;&quot;5\/2013&quot; <\/p>\n<p>Wenn Sie nun das Feld <b>Bestelldatum<\/b> nochmals zum Entwurfsraster hinzuf&uuml;gen und in der Zeile <b>Kriterium <\/b>den folgenden Ausdruck eintragen, sind die Arbeiten an dieser Abfrage bereits erledigt:<\/p>\n<pre>&gt;=[Startdatum] Und &lt;[Enddatum]<\/pre>\n<p>Einen Ansatz zur L&ouml;sung des Problems liefert die SQL-Ansicht einer Kreuztabellen-Abfrage, die &uuml;ber das Eigenschaftsfenster mit fixierten Spalten&uuml;berschriften ausgestattet wurde.<\/p>\n<p>Diese landen n&auml;mlich in Form einer <b>IN<\/b>-Klausel am Ende der SQL-Definition der Abfrage. Der &Uuml;bersicht halber haben wir den Namen der Quellabfrage <b>qryUmsaetzeNachKundeUndMonat_Base <\/b>durch den Alias <b>t1 <\/b>ersetzt:<\/p>\n<pre>TRANSFORM Sum(t1.Umsatz) AS SummevonUmsatz\r\nSELECT t1.KundeID, t1.Firma\r\nFROM qryUmsaetzeNachKundeUndMonat_Base AS t1\r\nWHERE (t1.Bestelldatum&gt;=[Startdatum]\r\nAnd t1.Bestelldatum&lt;[Enddatum])\r\nGROUP BY t1.KundeID, t1.Firma, t1.Bestelldatum\r\nPIVOT Month([Bestelldatum]) &amp; &quot;\/&quot;\r\n&amp; Year([Bestelldatum])\r\nIn (&quot;7\/2011&quot;,&quot;8\/2011&quot;,&quot;9\/2011&quot;,&quot;10\/2011&quot;,\r\n&quot;11\/2011&quot;,&quot;12\/2011&quot;,&quot;1\/2012&quot;,&quot;2\/2012&quot;,&quot;3\/2012&quot;,\r\n&quot;4\/2012&quot;,&quot;5\/2012&quot;,&quot;6\/2012&quot;,&quot;7\/2012&quot;,&quot;8\/2012&quot;,\r\n&quot;9\/2012&quot;,&quot;10\/2012&quot;,&quot;11\/2012&quot;,&quot;12\/2012&quot;,&quot;1\/2013&quot;,\r\n&quot;2\/2013&quot;,&quot;3\/2013&quot;,&quot;4\/2013&quot;,&quot;5\/2013&quot;);<\/pre>\n<p>Hier finden sich nun zwei Anteile, die wir beim dynamischen Setzen eines Filters beachten m&uuml;ssen: Einerseits das Kriterium (<b>&gt;=[Startdatum] Und &lt;[Enddatum]<\/b>) und zweitens die Liste der Spaltenk&ouml;pfe. Die Aufgabe lautet nun, beides synchron anzupassen.<\/p>\n<p>Die erste Idee ist, die <b>In<\/b>-Klausel mit einer Unterabfrage zu f&uuml;llen, die ebenfalls das Kriterium <b>&gt;=[Startdatum] Und &lt;[Enddatum] <\/b>enth&auml;lt und nur die Monate zur&uuml;ckliefert, die durch das Kriterium festgelegt werden.<\/p>\n<p>Um es kurz zu machen: Der Versuch ist fehlgeschlagen. Sie k&ouml;nnen zwar eine Abfrage definieren, die genau die gew&uuml;nschten Spalten&uuml;berschriften zur&uuml;ckliefert, allerdings nicht in der gew&uuml;nschten Reihenfolge.<\/p>\n<p><b>Abfrageerstellung per VBA<\/b><\/p>\n<p>Also gehen wir das Problem mit einer VBA-Prozedur an. Diese sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-44-anchor\">Listing 1<\/a><\/span> aus und legt die gew&uuml;nschte Abfrage neu an beziehungsweise aktualisiert ihren SQL-Ausdruck. Die Abfrage erwartet das Start- und das Enddatum f&uuml;r die Berechnung der Ums&auml;tze als Parameter. Nach der Deklaration legt sie den Namen der zu erstellenden Abfrage fest, in diesem Fall <b>qryUmsaetzeNachKundenUndDatumMitSpaltenkoepfen<\/b>. Sollte bereits eine entsprechende Abfrage existieren, wird diese geschlossen.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Erstellen einer Abfrage zum Berechnen von Ums&auml;tzen<\/p>\n<pre>Public Sub KundenUmsaetze(datStart As Date, datEnde As Date)\r\n     Dim db As DAO.Database\r\n     Dim qdf As DAO.QueryDef\r\n     Dim strSQL As String, strSpaltenueberschriften As String\r\n     Dim strQuery As String\r\n     Dim i As Integer\r\n     Dim j As Integer\r\n     Dim intMonatStart As Integer\r\n     Dim intMonatEnde As Integer\r\n     strQuery = &quot;qryUmsaetzeNachKundenUndDatumMitSpaltenkoepfen&quot;\r\n     On Error Resume Next\r\n     DoCmd.Close acQuery, strQuery\r\n     On Error GoTo 0\r\n     For i = Year(datStart) To Year(datEnde)\r\n           If Year(datStart) = i Then\r\n              intMonatStart = Month(datStart)\r\n              If Year(datEnde) = i Then\r\n                  intMonatEnde = Month(datEnde)\r\n              Else\r\n                  intMonatEnde = 12\r\n              End If\r\n          Else\r\n                intMonatStart = 1\r\n              If Year(datEnde) = i Then\r\n                  intMonatEnde = Month(datEnde)\r\n              Else\r\n                  intMonatEnde = 12\r\n              End If\r\n          End If\r\n          For j = intMonatStart To intMonatEnde\r\n               strSpaltenueberschriften = strSpaltenueberschriften &amp; &quot;,&quot; &amp; Chr(34) &amp; j &amp; &quot;\/&quot; &amp; i &amp; Chr(34)\r\n          Next j\r\n     Next i\r\n     strSpaltenueberschriften = Mid(strSpaltenueberschriften, 2)\r\n     Set db = CurrentDb\r\n     strSQL = strSQL &amp; &quot;TRANSFORM Sum(t1.Umsatz) AS SummevonUmsatz&quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;SELECT t1.KundeID, t1.Firma&quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;FROM qryUmsaetzeNachKundeUndMonat_Base AS t1&quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;WHERE (((Bestelldatum)&gt;=[Startdatum] And (Bestelldatum)&lt;[Enddatum]))&quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;GROUP BY t1.KundeID, t1.Firma&quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;PIVOT Month([Bestelldatum]) &amp; &quot;&quot;\/&quot;&quot; &amp; Year([Bestelldatum]) &quot; &amp; vbCrLf\r\n     strSQL = strSQL &amp; &quot;In ([Spaltenueberschriften]);&quot; &amp; vbCrLf\r\n     strSQL = Replace(strSQL, &quot;[Startdatum]&quot;, ISODatum(datStart))\r\n     strSQL = Replace(strSQL, &quot;[Enddatum]&quot;, ISODatum(datEnde))\r\n     strSQL = Replace(strSQL, &quot;[Spaltenueberschriften]&quot;, strSpaltenueberschriften)\r\n     On Error Resume Next\r\n     Set qdf = db.QueryDefs(strQuery)\r\n     If Err.Number = 3265 Then Set qdf = db.CreateQueryDef(strQuery)\r\n     qdf.SQL = strSQL\r\n     DoCmd.OpenQuery strQuery\r\nEnd Sub<\/pre>\n<p>Danach beginnt die Zusammenstellung der <b>In<\/b>-Klausel mit den fixierten Spalten&uuml;berschriften. Dazu untersucht die Prozedur das Start- und das Enddatum und f&uuml;gt f&uuml;r jeden Monat einen Eintrag zu der in der Variablen <b>strSpaltenueberschriften <\/b>gespeicherten Liste hinzu. Der Vorgang erfolgt mithilfe zweier <b>For&#8230;Next<\/b>-Schleifen. Die &auml;u&szlig;ere durchl&auml;uft alle betroffenen Jahre. Das erste Jahr wird mit <b>Year(datStart) <\/b>ermittelt, das letzte Jahr mit <b>Year(datEnde)<\/b>. Innerhalb der Schleife ermittelt die Prozedur zun&auml;chst, ob das aktuell durchlaufene Jahr das erste Jahr ist. Falls ja, erh&auml;lt die Variable <b>intMonatStart <\/b>den Wert von <b>Month(datStart)<\/b> als Wert, also die Nummer des ersten Monats des ersten Jahres, sonst den Wert <b>1<\/b> (f&uuml;r die folgenden Jahre bis zum letzten Jahr). <\/p>\n<p>Wenn das aktuell durchlaufene Jahr das erste Jahr ist, gibt es f&uuml;r den letzten Monat des Jahres zwei M&ouml;glichkeiten: Entweder das durchlaufene Jahr ist gleichzeitig das letzte Jahr (etwa bei 1.1.2012 bis 31.3.2012) oder das aktuelle Jahr ist nicht das letzte Jahr (1.1.2012 bis 31.1.2013). Im ersten Fall wird <b>intMonatEnde<\/b> auf <b>Month(datEnde) <\/b>eingestellt, also beispielsweise auf <b>3<\/b>. Im zweiten Fall erh&auml;lt <b>intMonatEnde <\/b>den Wert <b>12<\/b>, da ja noch mindestens ein weiteres Jahr folgt.<\/p>\n<p>Sollte das aktuell durchlaufene Jahr nicht das erste Jahr sein, erh&auml;lt <b>intMonatStart <\/b>auf jeden Fall den Wert <b>1<\/b>. Ist das aktuelle Jahr aber das letzte Jahr, wird <b>intMonatEnde <\/b>auf den Wert <b>Month(datEnde) <\/b>eingestellt, sonst auf den Wert <b>12<\/b>, da ja noch weitere Jahre folgen.<\/p>\n<p>Nachdem das Jahr in der Variablen <b>i <\/b>gespeichert wurde und der erste und der letzte Monat des aktuellen Jahres in den Variablen <b>intMonatStart <\/b>und <b>intMonatEnde<\/b>, durchl&auml;uft die innere Schleife alle Monate des Jahres und stellt die Liste der Monate in der Form <b>m\/yyyy <\/b>zusammen.<\/p>\n<p>Auf diese Weise entsteht ein Ausdruck wie der folgende:<\/p>\n<p class=\"listing-fliesstext\">,&quot;1\/2012&quot;,&quot;2\/2012&quot;,&quot;3\/2012&quot;,&#8230;<\/p>\n<p>Das f&uuml;hrende Komma wird in der folgenden Zeile entfernt. Danach weist die Prozedur der Variablen <b>db<\/b> einen Verweis auf die aktuelle Datenbank zu und stellt den kompletten SQL-Ausdruck f&uuml;r die Kreuztabellen-Abfrage zusammen. Den gr&ouml;&szlig;ten Teil kennen Sie ja bereits. Neben den beiden Platzhaltern <b>[Startdatum] <\/b>und <b>[Enddatum] <\/b>wurde f&uuml;r die <b>In<\/b>-Klausel noch ein weiterer Platzhalter namens <b>[Spaltenueberschriften] <\/b>hinzugef&uuml;gt.<\/p>\n<p>Nachdem die SQL-Anweisung in mehreren Schritten zusammengesetzt wurde, ersetzt die Prozedur noch die Platzhalter. F&uuml;r <b>[Startdatum] <\/b>wird das mit der Funktion <b>IsoDatum <\/b>f&uuml;r den Gebrauch in einer SQL-Anweisung aufbereitete Startdatum eingesetzt und f&uuml;r <b>[Enddatum] <\/b>der entsprechende Ausdruck f&uuml;r den letzten zu ber&uuml;cksichtigenden Tag.<\/p>\n<p>Der Platzhalter <b>[Spaltenueberschriften] <\/b>wird schlie&szlig;lich mit dem Wert der Variablen <b>strSpaltenueberschriften <\/b>gef&uuml;llt. Die folgende Anweisung versucht, nachdem die Fehlerbehandlung deaktiviert wurde, eine bestehende Abfrage namens <b>qryUmsaetzeNachKundenUndDatumMitSpaltenkoepfen <\/b>zu &ouml;ffnen. Ist diese nicht vorhanden, wird die Abfrage kurzerhand mit der <b>CreateQueryDef<\/b>-Methode erstellt.<\/p>\n<p>Damit liegt die Zielabfrage sicher vor und kann in der folgenden Anweisung mit dem in <b>strSQL <\/b>gespeicherten SQL-Ausdruck gef&uuml;llt werden. Diese wird schlie&szlig;lich mit der <b>OpenQuery<\/b>-Methode ge&ouml;ffnet und somit angezeigt.<\/p>\n<p>Die Methode rufen Sie beispielsweise mit der folgenden Anweisung auf, das Ergebnis sehen Sie in Bild 7:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_04\/KreuztabellenMitKriterien-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: Kreuztabellen-Abfrage mit sauber definierten und sortierten Spalten&uuml;berschriften<\/span><\/b><\/p>\n<pre>KundenUmsaetze &quot;1.1.2012&quot;, &quot;31.5.2012&quot;<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Sind die Spalten&uuml;berschriften einer Kreuztabellen-Abfrage beim &Ouml;ffnen nicht bekannt, m&uuml;ssen diese zur Laufzeit zum SQL-Ausdruck hinzugef&uuml;gt werden. Dies gelingt mit einer entsprechenden VBA-Prozedur mit &uuml;berschaubarem Aufwand. In einem weiteren Beitrag namens <b>Kreuztabellen-Abfragen in Berichten <\/b>(<b>www.access-im-unternehmen.de\/848<\/b>) erfahren Sie, wie Sie statische, aber auch dynamische Kreuztabellen-Abfragen wie in diesem Beitrag beschrieben in einem Bericht anzeigen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>DynamischeKreuztabellen_Abfragen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{9D327E61-8A1D-43CA-A220-016E0DF2E332}\/aiu_846.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Kreuztabellenabfragen erlauben die Gruppierung von Daten nach zwei Kriterien, die als Spalten- und Zeilenk&ouml;pfe dargestellt werden. Solange Sie eine solche Abfrage manuell und statisch erstellen, k&ouml;nnen Sie diese mit aussagekr&auml;ftigen Spalten&uuml;berschriften versehen. Sobald die Daten jedoch etwa per Parameter gefiltert werden sollen, wird es kompliziert, denn auch die Spalten&uuml;berschriften m&uuml;ssen dann dynamisch angepasst werden. Dieser Beitrag zeigt M&ouml;glichkeiten, dieses Problem zu l&ouml;sen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662012,66042012,44000029],"tags":[],"class_list":["post-55000846","post","type-post","status-publish","format-standard","hentry","category-662012","category-66042012","category-Abfragetechnik_und_SQL"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kreuztabellen-Abfragen mit Kriterien - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kreuztabellen-Abfragen mit Kriterien\" \/>\n<meta property=\"og:description\" content=\"Kreuztabellenabfragen erlauben die Gruppierung von Daten nach zwei Kriterien, die als Spalten- und Zeilenk&ouml;pfe dargestellt werden. Solange Sie eine solche Abfrage manuell und statisch erstellen, k&ouml;nnen Sie diese mit aussagekr&auml;ftigen Spalten&uuml;berschriften versehen. Sobald die Daten jedoch etwa per Parameter gefiltert werden sollen, wird es kompliziert, denn auch die Spalten&uuml;berschriften m&uuml;ssen dann dynamisch angepasst werden. Dieser Beitrag zeigt M&ouml;glichkeiten, dieses Problem zu l&ouml;sen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:47:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kreuztabellen-Abfragen mit Kriterien\",\"datePublished\":\"2020-05-22T21:47:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/\"},\"wordCount\":1633,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/90f66b47445e4c4897fcf52ded6defee\",\"articleSection\":[\"2012\",\"4\\\/2012\",\"Abfragetechnik und SQL\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/\",\"name\":\"Kreuztabellen-Abfragen mit Kriterien - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/90f66b47445e4c4897fcf52ded6defee\",\"datePublished\":\"2020-05-22T21:47:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/90f66b47445e4c4897fcf52ded6defee\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/90f66b47445e4c4897fcf52ded6defee\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/KreuztabellenAbfragen_mit_Kriterien\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kreuztabellen-Abfragen mit Kriterien\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kreuztabellen-Abfragen mit Kriterien - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/","og_locale":"de_DE","og_type":"article","og_title":"Kreuztabellen-Abfragen mit Kriterien","og_description":"Kreuztabellenabfragen erlauben die Gruppierung von Daten nach zwei Kriterien, die als Spalten- und Zeilenk&ouml;pfe dargestellt werden. Solange Sie eine solche Abfrage manuell und statisch erstellen, k&ouml;nnen Sie diese mit aussagekr&auml;ftigen Spalten&uuml;berschriften versehen. Sobald die Daten jedoch etwa per Parameter gefiltert werden sollen, wird es kompliziert, denn auch die Spalten&uuml;berschriften m&uuml;ssen dann dynamisch angepasst werden. Dieser Beitrag zeigt M&ouml;glichkeiten, dieses Problem zu l&ouml;sen.","og_url":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:47:38+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kreuztabellen-Abfragen mit Kriterien","datePublished":"2020-05-22T21:47:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/"},"wordCount":1633,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee","articleSection":["2012","4\/2012","Abfragetechnik und SQL"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/","url":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/","name":"Kreuztabellen-Abfragen mit Kriterien - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee","datePublished":"2020-05-22T21:47:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/90f66b47445e4c4897fcf52ded6defee"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/KreuztabellenAbfragen_mit_Kriterien\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kreuztabellen-Abfragen mit Kriterien"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000846"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000846\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}