collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 52
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 3
  • Punkt Benutzer Online:

* Forenstatistik

  • stats Mitglieder insgesamt: 13800
  • stats Beiträge insgesamt: 63497
  • stats Themen insgesamt: 8604
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden  (Gelesen 1961 mal)

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #15 am: Mai 28, 2017, 16:22:36 »
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.

 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #16 am: Mai 29, 2017, 08:04:12 »
Zitat
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
"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.
Mit freundlichem Glück Auf!

Eberhard
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #17 am: Juni 05, 2017, 14:12:11 »
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?
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #18 am: Juni 06, 2017, 22:52:03 »
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
Mit freundlichem Glück Auf!

Eberhard
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #19 am: Juni 07, 2017, 07:57:11 »
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
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #20 am: Juni 08, 2017, 00:06:27 »
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.
Zitat
Wie hast du die yy überhaupt erstellt?
Grundlagen - SQL ist leicht (6) - Komplexe Abfragen schreiben und lesen
Mit freundlichem Glück Auf!

Eberhard
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #21 am: Juni 08, 2017, 08:06:50 »
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
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #22 am: Juni 08, 2017, 18:05:04 »
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.
Mit freundlichem Glück Auf!

Eberhard
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #23 am: Juni 08, 2017, 23:01:49 »
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
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #24 am: Juni 13, 2017, 22:34:50 »
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 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")
Mit freundlichem Glück Auf!

Eberhard
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #25 am: Juni 13, 2017, 22:46:23 »
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!!!
 

Offline sashstyle

  • Newbie
  • Beiträge: 40
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #26 am: Juli 02, 2017, 09:59:14 »
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!
 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #27 am: Juli 03, 2017, 11:54:21 »
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")
Mit freundlichem Glück Auf!

Eberhard
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 23089
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #28 am: Juli 03, 2017, 12:22:08 »
Hallo,

@ebs17 zur Info:

Zitat
Farbe im Code ist hier leider nicht möglich):

"Zitat" anstelle von "Code" löst dieses Problem.

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 819
Re: Abfrage soll 0 ausgeben wenn kein Datensatz vorhanden
« Antwort #29 am: Juli 03, 2017, 19:22:32 »
Ansonsten:
Zitat
Vorab 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.
« Letzte Änderung: Juli 03, 2017, 23:02:36 von ebs17 »
Mit freundlichem Glück Auf!

Eberhard