Hi Leute,
ich hab eine Kreuztabellenabfrage welche mir pro Frage die jeweilige Anzahl der gegebenen Antworten (vier stehen zur Auswahl) ausgeben soll --- liegt allerdings kein Datensatz vor der "gezählt" werden kann, dann kommt eine Fehlermeldung
Ideen?
Hier der Code:
TRANSFORM Val(Nz(Count([BanAntwortenID]),0)) AS Ausdr1
SELECT BanFragen.BanFrageText
FROM Berichtzeitraum, BanFragen INNER JOIN (BanBefragungen INNER JOIN (BanAntworten INNER JOIN BanGastantworten ON BanAntworten.BanAntwortenID = BanGastantworten.BanAntwortenID_F) ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F) ON BanFragen.BanFrageID = BanGastantworten.BanFrageID_F
WHERE (((BanBefragungen.BanBefragungDatum) Between [Berichtzeitraum].[Startdatum] And [Berichtzeitraum].[Enddatum]))
GROUP BY BanFragen.BanFrageID, BanFragen.BanFrageText
ORDER BY BanFragen.BanFrageID
PIVOT BanAntworten.BanAntwortenText;
DANKE!
Val(Nz(Count([BanAntwortenID]),0))
Ein Zählen einer leeren Datenmenge ergibt 0. Das dürfte man schon vom DCount kennen, wo man feststellt, ob es Datensätze gibt.
Nicht NULL, somit ist Nz umsonst und reine Selbstbeschäftigung.
Da 0 eine Zahl ist, muss man dann auch nicht den Zahlenwert per Val herausziehen.
Zitateine Fehlermeldung
Ideen?
Reichlich. Es gibt wohl ca. 65.000 Fehlernummern.
Vielleicht könnte man das am Thema einschränken?
Hi ebs17,
danke für deine Antwort - leider hab ich keine Benachrichtung erhalten und hatte auch erst jetzt wieder Zeit zum online gehen... daher sorry für die späte Rückmeldung!
Den Code habe ich damals von jemandem bekommen aus einem Forum und kann den auch nicht wirklich richtig lesen :-(
Kannst du mir sagen was ich ändern muss, damit bei der Kreuztabellen-Abfrage auch Werte angegeben werden, wenn das Ergebnis 0 ist?
Kurz zum Hintergrund:
Ich hab Fragen und dazu Antwortmöglichkeiten (1, 2, 3 oder eben keines davon), diese werden in einer Befragung zusammengeführt (pro Frage werden alle Antwortmöglichkeiten zur Auswahl gestellt). Wenn ich eine Abfrage ausführe erscheint für jede Frage die entsprechende Anzahl an abgegebenen Antworten (z.B. Frage 1 Antwort 1 = 3x; Antwort 2 = 7x; Antwort 3 = 2x; unbeantwortet = 8x) ... wenn es allerdings zu wenig bis gar keine beantworteten Fragen gibt, dann wird gar nichts angezeigt (nicht einmal 0).
Ich danke dir vielmals!
Sascha
Bei Kreuztabellen muss man etwas tricksen, um an das gewüschte Resultat zu gelangen. Damit wir von einer gleichen Basis ausgehen, habe ich eine Tabelle
Frage Frage FrageId | FrageText | 1 | F1 | 2 | F2 | 3 | F3 | ... und eine Tabelle Antwort angelegt.
Antwort AntwortId | FrageId | Antwort | 1 | 1 | 3 | 2 | 1 | 3 | 3 | 1 | 3 | 4 | 1 | 2 | 5 | 3 | 1 | 6 | 3 | 2 | 7 | 3 | 2 | 8 | 3 | 2 | 9 | 3 | 1 | 10 | 3 | 2 |
Eine einfache Kreuztabellenabfrage (wichtig ist der Left-Join)
|
|
RANSFORM Count(a.antwort) AS cnt
SELECT f.fragetext
FROM FRAGE AS f
LEFT JOIN ANTWORT AS a
ON f.frageid = a.frageid
GROUP BY f.fragetext
PIVOT a.antwort;
liefert dann dieses Ergebnis.
Query1 FrageText | <> | 1 | 2 | 3 | F1 | | | 1 | 3 | F2 | 0 | | | | F3 | | 2 | 4 | |
Die Spalte <> lässt sich durch das Festlegen fixierter Spaltenüberschriften eliminieren.
|
TRANSFORM Count(a.antwort) AS cnt
SELECT f.fragetext
FROM FRAGE AS f
LEFT JOIN ANTWORT AS a
ON f.frageid = a.frageid
GROUP BY f.fragetext
PIVOT a.antwort IN (1,2,3);
Die Sache schaut dann so aus:
Query1 Durch Einstellen der Format-Eigenschaften für die Spalte mit dem Alias-Namen c auf 0;0;0;0 sollte das Ergenis wunschgemäß erscheinen: Query1 FrageText | 1 | 2 | 3 | F1 | 0 | 1 | 3 | F2 | 0 | 0 | 0 | F3 | 2 | 4 | 0 |
|
|
hi lachtaube, besten dank für die super schnelle antwort.
beigefügt der screenshot von der bisherigen kreuztabellen-abfrage ... ich kann den code von dir nicht vollständig umschreiben weil ich denke, dass du es mit zwei tabellen gelöst hast und ich eben drei habe
HtlFrage
HtlAntworten
HtlBefragungen
...welche alle in dieser zusammen gefasst werden
HtlGastantworten
Sind das Multiple-Choice Fragen - oder wie muss man sich die Sachlage vorstellen?
PS: Im Prinzip musst Du nichts anderes machen, als zunächst die Antworten in einer Abfrage zusammenzufassen und diese Abfrage dann wie die Antwort-Tabelle im Beispiel zu behandeln.
ZitatSind das Multiple-Choice Fragen - oder wie muss man sich die Sachlage vorstellen?
ja - zur auswahl stehen die antworten wie folgt:
tabelle: HtlAntworten
feld1: HtlAntwortenID (1,2,3) KEY
feld2: HtlAntwortenText (sehr zufrieden, zufrieden, unzufrieden UND unbeantwortet wenn nix selektiert ist)
Wenn keine Mehrfachantworten je Frage möglich sind, ist das Modell suboptimal ausgefallen, denn Befragungen zu Gastantworten stellen dann immer eine (in dem Fall überflüssige) 1:1-Beziehung dar. Trotzdem sollte der beschriebene Weg noch zum Ziel führen.
hi lachtaube, wie hättest du des denn dann gelöst? ich hab damals viel rumgefragt und die jetzt genutzte ist die einzige funktionierende lösung gewesen (daher hab ich die genutzt) ... naja funktionierend solang bis zu dem aktuellen fehler ;-)
kannst du mir deinen code nochmal kurz erklären was ich von meinen tabellen/feldnamen wo eintragen muss?
f = HtlFrage
a = HtlAntworten
...nehme ich an oder?
hi lachtaube,
ich hab nun hin und her gebastelt und es klappt einfach nicht :-( kannst du dir das bitte nochmal anschauen? *liebguck*
hier noch einmal die ausgangssituation ausführlich beschrieben (mag sein, dass es umständlich ist, doch darauf baut aktuell einfach alles auf was im hintergrund dazu gehört):
Tabelle 1 heißt "BanFragen" und beinhaltet vier Fragen:
Technik1
Technik2
Technik3
Technik4
Tabelle 2 heißt "BanAntworten" und beinhaltet vier Antwortmöglichkeiten:
Wert 0 = unbeantwortet
Wert 1 = sehr zufrieden
Wert 2 = weniger zufrieden
Wert 3 = unzufrieden
Tabelle 3 heißt "BanBefragungen" und hier werden Datum & Co. erfasst sowie mit Hilfe eines Buttons die Fragen aus Tabelle 1 eingefügt und pro Frage die Werte 1-3 zum anklicken aus Tabelle 2 (unbeantwortet ist es dann wenn nichts angeklickt wird), so dass darauf die Tabelle 4 entsteht:
Tabelle 4 heißt "BanGastantworten" und hier werden die drei bisherigen Tabellen zusammen gefasst in den Feldern
BanFrageID
BanBefragungID
BanAntwortID
...habe ich also in Tabelle 3 (BanBefragungen) eine Befragung vollständig ausgefüllt, so steht in Tabelle 4 folgendes:
BanFrageID 1
BanBefragungID xy (autowert)
BanAntwortID 3
BanFrageID 2
BanBefragungID xy (autowert)
BanAntwortID 3
BanFrageID 3
BanBefragungID xy (autowert)
BanAntwortID 3
BanFrageID 4
BanBefragungID xy (autowert)
BanAntwortID 0
= es gibt nun 3x die Antwort 3 (unzufrieden) und 1x die Antwort 0 (unbeantwortet)
In der abschließenden Kreuztabellenabfrage gibts folgendes Layout:
Zeilenüberschrift = BanFrageText
Spaltenüberschrift = BanAntwortenText
Wert = BanAntworten
Momentan ergibt diese Abfrage mit dem obigen Beispiel aber keine Kreuztabelle, weil nicht für jede Frage ein Wert vorliegt, sondern für Wert 3 = 3 und für Wert 0 = 1
...und genau das ist mein Problem
Ich habe inzwischen in der Kreuztabellenabfrage bei Wert das Feld wie folgt ausgefüllt:
Ausdr1: Wert(Nz(Anzahl([BanAntwortenID]);0))
...damit werden wenigstens wenn jede Antwort mindestens einen "Klick" aufweist auch mindestens die Zahl 0 angezeigt
...aber wie gesagt, wenn mal keine Befragung ausgefüllt wurde ODER eine Befragung nur eine Antwort aufweist (z.B. sehr zufrieden) und die anderen Antworten im Abfragezeitraum keinerlei "Klicks" haben, bekomme ich die Fehlermeldung:
"Das MS Access DB-Modul erkennt '[weniger zufrieden]' nicht als gültigen Feldnamen oder Ausdruck."
...kannst du die Sachlage des Problems verstehen und mir BITTE helfen?
VIELEN DANK!
Sascha
Hallo,
zeig doch besser den SQL-String der Abfrage, bei/mit dem der Fehler auftaucht...
Interpretativ heißt das, dass "[weniger zufrieden]" als Feldname erkannt wird, den es natürlich nicht gibt.
Hi DF6GL, der Code ist im ersten Post von mir hinterlegt - an dem hat sich bislang (meins Wissens) nichts geändert... Danke!
Hallo,
steht dann das:
ZitatIch habe inzwischen in der Kreuztabellenabfrage bei Wert das Feld wie folgt ausgefüllt:
Ausdr1: Wert(Nz(Anzahl([BanAntwortenID]);0))
...damit werden wenigstens wenn jede Antwort mindestens einen "Klick" aufweist auch mindestens die Zahl 0 angezeigt
nicht im Widerspruch dazu?
Zitat von: DF6GL am Mai 26, 2017, 15:17:46
Hallo,
steht dann das:
ZitatIch habe inzwischen in der Kreuztabellenabfrage bei Wert das Feld wie folgt ausgefüllt:
Ausdr1: Wert(Nz(Anzahl([BanAntwortenID]);0))
...damit werden wenigstens wenn jede Antwort mindestens einen "Klick" aufweist auch mindestens die Zahl 0 angezeigt
nicht im Widerspruch dazu?
...ich glaub das hab ich falsch formuliert - mir hat man gesagt, dass diese eingabe dafür sorgt, dass ich die zahl "0" angezeigt bekomme, wenn innerhalb einer befragung bei einer frage eine antwort nie angeklickt wurde - z.b. so:
befragung 1
frage 1
gegebene antwort 3
somit hab ich das abfrage ergebnis
frage 1 - antwort 3 - 1x
frage 1 - antwort 1 - 0x
frage 1 - antwort 2 - 0x
frage 1 - antwort 0 - 0x
...oder hab ich diese funktion falsch verstanden?
Hallo,
wenn Du Inner Join Verknüpfung verwendest, werden "leere" Ds nicht mit angezeigt.
Versuch mal left, bzw. right join einzusetzen.
Zitat von: DF6GL am Mai 27, 2017, 08:31:22
Versuch mal left, bzw. right join einzusetzen.
...hat leider beides nicht geklappt, wobei ich so vorgegangen bin, dass ich erstmal alle auf LJ eingestellt hatte, dann alle auf RJ und anschließend jede der drei beziehungen einzeln LJ oder RJ ... ohne Erfolg - aber folgende Fehlermeldungen:
nur LJ oder RJ : "JOIN Ausdruck nicht unterstützt"
einzeln jeweils: "Die SQL Abfrage konnte nicht ausgeführt werden, da sie mehrdeutige äußere Verknüpfungen enthält. ..." und ich soll erst die äußeren Abfragen separat erstellen etc.
ZitatMomentan ergibt diese Abfrage mit dem obigen Beispiel aber keine Kreuztabelle, weil nicht für jede Frage ein Wert vorliegt, sondern für Wert 3 = 3 und für Wert 0 = 1
"Fehlende" Datensätze bekommt man nicht durch Tricksereien oder probierendes Testen, sondern man muss zusätzlich zur eigenen Ergebnismenge eine vollständige Menge ins Spiel bringen.
Falls Du einen konkreteren Vorschlag benötigst, müsstest Du eine passende Demo-Datenbank einstellen. Das "Abmalen" von Bildern und Beschreibungen liegt nicht so in meiner Neigung, das kann der Fragesteller besser bzw. er hat das Ganze ja schon vorliegen.
hi ebs17, ich hab nun mal eine blanko-db erstellt und diese unter https://drive.google.com/open?id=0B0mliQt30luzSUxrSE13S283cWM online bereit gestellt... ich weiß nicht wie man es nennt, aber du kommst nur an die bearbeitungsebene wenn du die datenbank mit gedrückter shift-taste öffnest...
was brauchst du sonst noch?
Was würdest Du dazu sagen:
TRANSFORM
Nz(COUNT(yy.BanAntwortenID_F), 0) AS AnzahlvonBanAntwortenID_F
SELECT
yy.BanFrageText
FROM
(
SELECT
BF.BanFrageText,
IIF(U.BanAntwortenText IS NULL, "unbeantwortet", U.BanAntwortenText) AS BanAntwortenText,
U.BanAntwortenID_F
FROM
BanFragen AS BF
LEFT JOIN
(
SELECT
BGA.BanFrageID_F,
BGA.BanAntwortenID_F,
BA.BanAntwortenText
FROM
Berichtzeitraum,
BanBefragungen AS BB
INNER JOIN
(BanAntworten AS BA
INNER JOIN BanGastantworten AS BGA
ON BA.BanAntwortenID = BGA.BanAntwortenID_F
)
ON BB.BanBefragungID = BGA.BanBefragungID_F
WHERE
BB.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum
AND
Berichtzeitraum.Enddatum
) AS U
ON BF.BanFrageID = U.BanFrageID_F) AS yy
GROUP BY
yy.BanFrageText
PIVOT
yy.BanAntwortenText
hi ebs17, DANKE DANKE DANKE --- das geht ja schon super in die Richtung die ich benötige --- jetzt kommt das kleine ABER:
in der von mir erstellten Abfrage BanAuswertung Kreuz siehst du ja, dass ich das ganze nach Zeitraum selektiert habe... mein plumper Versuch einfach die Tabelle Berichtszeitraum zu integrieren schlug fehl, da ich ja das Referenzdatum auf BanBefragungDatum benötige - doch dieses nicht einfach zustellen konnte...
Wie muss ich vorgehen?
Wie bekomm ich BanBefragungDatum noch in deine erstellte yy rein?
Wie hast du die yy überhaupt erstellt?
Lieben Dank
Sascha
Die Zeitraukfilterung sollte funktionieren, die habe ich auch nicht geändert. Allerdings darf die verwendete Tabelle Berichtzeitraum immer nur genau einen Datensatz liefern, weil sonst über die Kreuzprodukt-Einbindung eine unkontrollierte Datenmengenvermehrung erfolgt.
ZitatWie hast du die yy überhaupt erstellt?
Grundlagen - SQL ist leicht (6) - Komplexe Abfragen schreiben und lesen (http://www.ms-office-forum.net/forum/showthread.php?t=317066)
hi ebs17, mein fehler - stimmt der berichtszeitraum von dem es immer nur max. 1 datensatz gibt klappt... wenn ich nun einen einzigen datensatz anlege und hierfür nur eine frage beantworte - der rest bleibt unbeantwortet liefert mit die abfrage das ergebnis:
frage 1 antwort 0 0x antwort 1 1x
frage 2 antwort 0 1x antwort 1 0x
frage 3 antwort 0 1x antwort 1 0x
frage 4 antwort 0 1x antwort 1 0x
aber die ergebnise 0x bei antwort 2 und antwort 3 zeigt es mir nicht an ... wie bekomm ich das noch eingebaut?
vielen dank
sascha
Mal so gesagt: Ich kann die Aufgabe nicht nachvollziehen.
Man bräuchte eine Darstellung des Wunschergebnisses sowie eine Datenbasis mit einigen normalen und einigen entsprechenden kritischen Datensätzen. Das Wunschergebnis muss sich natürlich aus der gegebenen Datenbasis unmittelbar erzeugen lassen.
Zur vorigen Demo würde ich bemängeln:
- Demo heißt Herauslösung der nötigen Grundlagen für das Problem, hier also nur Tabellen inkl. Beziehungen zzgl. Abfrageversuch, nicht aber ein Sammelsurium von sonstigen Formularen, Berichten, Tabellen usw.
- Fehlende Fragen müssten in der Tabelle vorhanden sein und nicht erst selbständig nachzutragen sein.
- Wenn Antworten gezählt werden, hätte ich die Erwartung, dass die Datenbasis auch weiteres als nur 0 oder 1 hergibt.
ok - ich denke ich weiß was du meinst ebs17 ... daher habe ich die testdatenbank erneut online gestellt unter https://drive.google.com/file/d/0B0mliQt30luzMGUyS2NMUnUzeEU/view?usp=sharing
nun habe ich 2 datensätze für mai und 2 für juni erfasst > siehe tabelle "BanBefragung" hier habe ich zwei realistische beispiele erfasst welche so vorkommen können
die übersicht wie es aktuell IST und wie es sein SOLL ist beigefügt
Es (das Zeitfinden) hat etwas länger gedauert. Dafür machen wie es ausführlicher, so dass Du den Vorgang verstehen und sicher selber ausführen kannst => die Einzelabfragen kann man ausprobieren.
Von den vorangegangenen Hinweisen übernehmen wir vor allem jene: Abfragen funktionieren von innen nach außen (so baut man sie dann auch auf), und man muss eine vollständige Menge ins Spiel bringen, um "alles" sehen zu können.
Du möchtest alle Fragen und alle möglichen Antworten angezeigt sehen. Daraus erzeugen wir die vollständige Menge (VM - gleich als Alias (http://www.ms-office-forum.net/forum/showthread.php?t=298432) verwendet):
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
Die aktuell vorhandene Menge (AM) ergibt sich aus:
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
Berichtzeitraum,
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum
AND
Berichtzeitraum.Enddatum
Diese beiden bringen wir nun per OUTER JOIN zusammen:
SELECT
VM.BanFrageText,
VM.BanAntwortenText,
AM.BanAntwortenID_F
FROM
VM
LEFT JOIN AM
ON VM.BanFrageID = AM.BanFrageID_F
AND
VM.BanAntwortenID = AM.BanAntwortenID_F
... bzw. in vollständigem SQL (die anfänglichen Anweisungen einkopiert):
SELECT
VM.BanFrageText,
VM.BanAntwortenText,
AM.BanAntwortenID_F
FROM
(
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
) AS VM
LEFT JOIN
(
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
Berichtzeitraum,
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum
AND
Berichtzeitraum.Enddatum
) AS AM
ON VM.BanFrageID = AM.BanFrageID_F
AND
VM.BanAntwortenID = AM.BanAntwortenID_F
Aus der letzten Abfrage - nennen wir sie kurz B (für Basis) können wir nun die Kreuztabellenabfrage erstellen:
TRANSFORM
COUNT(BanAntwortenID_F)
SELECT
BanFrageText
FROM
B
GROUP BY
BanFrageText
PIVOT
BanAntwortenText
... bzw. wieder mit einkopierter SQL-Anweisung:
TRANSFORM
COUNT(B.BanAntwortenID_F) AS XX
SELECT
B.BanFrageText
FROM
(
SELECT
VM.BanFrageText,
VM.BanAntwortenText,
AM.BanAntwortenID_F
FROM
(
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
) AS VM
LEFT JOIN
(
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
Berichtzeitraum,
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum
AND
Berichtzeitraum.Enddatum
) AS AM
ON VM.BanAntwortenID = AM.BanAntwortenID_F
AND
VM.BanFrageID = AM.BanFrageID_F) AS B
GROUP BY
B.BanFrageText
PIVOT
B.BanAntwortenText
Zur Vervollständigung: Die Spaltenüberschriften erscheinen sortiert, hier in alphabetischer Sortierung. Diese ist aber für die Auswertung logisch anstrengend. Mit fixierten Spaltenüberschriften kann man das korrigieren (keine Ahnung, wie das in der allerersten Abfrage ohne Korrektur funktioniert hat).
Zudem ersetzen wir die Tabelle Berichtszeitraum, die hier als Parametertabelle eingesetzt wird, durch echte Parameter. So könnte man einfacher beliebige Zeiträume zur Auswertung festlegen:
PARAMETERS
[@Startdatum] Date,
[@Enddatum] Date
;
TRANSFORM
COUNT(B.BanAntwortenID_F) AS XX
SELECT
B.BanFrageText
FROM
(
SELECT
VM.BanFrageText,
VM.BanAntwortenText,
AM.BanAntwortenID_F
FROM
(
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
) AS VM
LEFT JOIN
(
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN [@Startdatum] AND [@Enddatum]
) AS AM
ON VM.BanAntwortenID = AM.BanAntwortenID_F
AND
VM.BanFrageID = AM.BanFrageID_F) AS B
GROUP BY
B.BanFrageText
PIVOT
B.BanAntwortenText IN("sehr zufrieden", "weniger zufrieden", "unzufrieden", "unbeantwortet")
WOW --- das ist mein eine Antwort !!! *DANKEDANKEDANKE*
ich bin ab morgen im Urlaub und schau mir das unterwegs in Ruhe mal an - bitte nicht böse sein, wenn ich mich erst nach dem Urlaub spätestens zurück melde ... ich geb mein bestes!
DANKE nochmals!!!
Hi ebs17,
VIELEN VIELEN DANK !
Das war die Lösung :-) es klappt wie gewünscht
Noch einen kleinen Schönheitsfehler im gelieferten Ergebnis und zwar werden die Fragen nicht nach HtlFrageID sortiert sondern nach HtlFrageText - doch es sollte nach ID sortiert werden.
Übergangsweise habe ich einfach die HtlFrageText-Inhalte mit den Zahlen 01- 02- 03- etc. ergänzt, da es ja nach ABC geht...
Hier mein aktueller Code wie er "rund" läuft:
Vorab zur Info: Deine Codes habe ich wie folgt benannt:
VM = BanAusA (Aus = Auswertung)
AM = BanAusB
etc.
zudem habe ich das Thema Berichtzeitraum über die Tabelle laufen lassen, weil ich diesen Wert somit nur einmal eingeben muss und er auch aufgedruckt wird im Bericht ... passt also
TRANSFORM
COUNT(BanAusE.BanAntwortenID_F) AS XX
SELECT
BanAusE.BanFrageText
FROM
(
SELECT
BanAusA.BanFrageText,
BanAusA.BanAntwortenText,
BanAusB.BanAntwortenID_F
FROM
(
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
) AS BanAusA
LEFT JOIN
(
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
Berichtzeitraum,
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum AND Berichtzeitraum.Enddatum
) AS BanAusB
ON BanAusA.BanAntwortenID = BanAusB.BanAntwortenID_F
AND
BanAusA.BanFrageID = BanAusB.BanFrageID_F) AS BanAusE
GROUP BY
BanAusE.BanFrageText
PIVOT
BanAusE.BanAntwortenText IN("sehr zufrieden", "weniger zufrieden", "unzufrieden", "unbeantwortet")
Ein ORDER BY habe ich versucht einzufügen nach GROUP BY, doch das geht glaub nicht ineinander - richtig?
Dann hab ich es versucht nach Zeile 20 - doch das ignoriert Access leider...
Kannst du mir da noch ein Hilfestellung geben?
DANKE nochmals!
Wenn Du nach der ID sortieren willst, musst Du sie aus den Unterabfragen der inneren Ebenen "hochziehen" in die obere Verarbeitung, damit sie erst einmal verfügbar ist.
In der Kreuztabellenabfrage ist dann die Sortierung möglich, wenn die ID zusätzlich zum Text gruppiert wird. Änderungen sind durch Abtrennung über Leerzeilen gekennzeichnet (Farbe im Code ist hier leider nicht möglich):
TRANSFORM
COUNT(BanAusE.BanAntwortenID_F) AS XX
SELECT
BanAusE.BanFrageText
FROM
(
SELECT
BanAusA.BanFrageID,
BanAusA.BanFrageText,
BanAusA.BanAntwortenText,
BanAusB.BanAntwortenID_F
FROM
(
SELECT
BanFragen.BanFrageID,
BanFragen.BanFrageText,
BanAntworten.BanAntwortenID,
BanAntworten.BanAntwortenText
FROM
BanFragen,
BanAntworten
) AS BanAusA
LEFT JOIN
(
SELECT
BanGastantworten.BanFrageID_F,
BanGastantworten.BanAntwortenID_F
FROM
Berichtzeitraum,
BanBefragungen
INNER JOIN BanGastantworten
ON BanBefragungen.BanBefragungID = BanGastantworten.BanBefragungID_F
WHERE
BanBefragungen.BanBefragungDatum BETWEEN Berichtzeitraum.Startdatum
AND
Berichtzeitraum.Enddatum
) AS BanAusB
ON BanAusA.BanAntwortenID = BanAusB.BanAntwortenID_F
AND
BanAusA.BanFrageID = BanAusB.BanFrageID_F) AS BanAusE
GROUP BY
BanAusE.BanFrageID,
BanAusE.BanFrageText
ORDER BY
BanAusE.BanFrageID
PIVOT
BanAusE.BanAntwortenText IN("sehr zufrieden", "weniger zufrieden", "unzufrieden", "unbeantwortet")
Hallo,
@ebs17 zur Info:
ZitatFarbe im Code ist hier leider nicht möglich):
"Zitat" anstelle von "Code" löst dieses Problem.
Ansonsten:
ZitatVorab zur Info: Deine Codes habe ich wie folgt benannt:
VM = BanAusA (Aus = Auswertung)
AM = BanAusB
... BanAusE, BanFragen, BanAntworten, ...
Für mich sehen diese Bezeichnungen alle ziemlich gleich und damit wenig selektiv aus. Ein flüchtiges Lesen mit sofortigem Verstehen (Zuordnung) fällt (mir) da deutlich schwerer.
PERFEKT
VIELEN herzlichen DANK!