Juli 29, 2021, 08:07:11

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Diagramm aus mehreren Feldern/Variablen erstellen

Begonnen von BikeArno, April 08, 2021, 15:57:16

⏪ vorheriges - nächstes ⏩

BikeArno

April 08, 2021, 15:57:16 Letzte Bearbeitung: April 09, 2021, 10:00:39 von BikeArno Grund: Code ergänzt
Hallo,

ich erstelle in meinen Berichten recht gut diverse Diagramme; auch mittels Code. Nur komme ich an einer Stelle nicht wirklich weiter:

Und zwar habe ich z.B. im konkreten Fall einen Fragenblock mit Mehrfachangaben, den ich in einem Diagramm darstellen will. Es gibt also 5 Felder mit true/false Ausprägung (v1 bis v5), die ich gerne in einem Balkendiagramm darstellen möchte (um nicht 5 Einzeldiagramme zu haben). Dargestellt werden müsste ja jeweils immer nur die Angabe "true" eines jeden Feldes.

Mit den Standardmitteln bekomme ich es nicht hin, geht sowas evtl. mittels entsprechendem Code? Wenn ja,  wie müsste der gestaltet sein?

Derzeit sieht er (für die ersten beiden Felder beispielhaft) so aus, funktioniert aber nicht:
SELECT Null,Count([v1]) AS [AnzahlVonv1] Where [v1] Like "true",Count([v2]) AS [AnzahlVonv2] Where [v2] Like "true" .....  FROM [qryDatensatz];

Ändere ich ihn wie folgt, funktioniert der Code zwar und zeigt mir für alle Felder einen Balken an, allerdings zählt er mir die Anzahl aller (!) Datensätze (also sowohl "true" und "False"). Ich möchte jedoch nur die Anzahl der "true"-Werte angezeigt bekommen; dies müsste doch eigentlich mit dem erstgenannten Code o.ä. möglich sein?

SELECT Null,Count([v1]) AS [AnzahlVonv1],Count([v2]) AS [AnzahlVonv2] ... FROM [qryDatensatz];
Über hilfreiche Tipps freue ich mich sehr.

markus888

Versuch es so:
SELECT Null, Abs(Sum([v1])) AS [AnzahlVonv1], Abs(Sum([v2])) AS [AnzahlVonv2] ...  FROM [qryDatensatz] WHERE ...;

10 Jahre Access

BikeArno

Zitat von: markus888 am April 09, 2021, 10:02:16Versuch es so:

Hallo Markus,

vielen Dank für die Hilfe, aber so funktioniert es auch nicht. Die Where-Klausel müsste sich ja auf jedes Feld separat beziehen, da für v1 bis v5 jeweils die "true"-Werte gezählt werden müssten.

Mein Gefühl sagt mir, es müsste so oder ähnlich aussehen:

SELECT Null,Count([v1] = "true") AS [AnzahlVonv1],Count([v2] = "true") AS [AnzahlVonv2] ... FROM [qryDatensatz]; Leider hat mein Gefühl nicht recht :-(

Davon mal abgesehen, funktioniert die Abs(Sum)-Formel aber leider auch ohne WHERE-Klausel nicht.

markus888

Zitat von: BikeArno am April 09, 2021, 13:33:34Die Where-Klausel müsste sich ja auf jedes Feld separat beziehen

Du brauchst keine Where Klausel, wenn alle Datensätze ausgewertet werden müssen.

Das Prinzip dahinter:

Ein True/False Feld liefert normal den Wert 0 oder -1.
Diese Werte werden dann summiert und mittels Abs wird ein positiver Wert zurückgegeben.

Ansonsten kannst du das auch mit einem Subselect im Select Teil lösen.
Aber ich vermute mal, SQL ist nicht so deins.

10 Jahre Access

BikeArno

April 09, 2021, 15:25:08 #4 Letzte Bearbeitung: April 09, 2021, 16:03:31 von BikeArno Grund: Erweiterung
Hallo,

sollte das Prinzip auch mit klein geschriebenen "true" funktionieren? Und leider ist es so, dass ich auch Felder habe, in denen nur eine "true" steht und kein "false" - die Datenqualität ist leider mangelhaft. Alles in allem habe ich den Code oben noch nicht "zum Laufen bringen können".

Zitat von: markus888 am April 09, 2021, 13:41:18Ansonsten kannst du das auch mit einem Subselect im Select Teil lösen.
Aber ich vermute mal, SQL ist nicht so deins.

Würde ich aber gerne lernen. Wie würde denn das Subselect im Select-Teil aussehen? Vielleicht hilft mir das eher weiter?

Gruß

BikeArno

Hallo,

ich habe inzwischen weiter rumprobiert (Beispiel Anhang).

Was mich ratlos macht: Ich habe die Ursprungstabelle für die Beispieldatei in eine neue Access-DB importiert - und siehe da, hier funktioniert u.g. Code, d.h. er zählt tatsächlich nur die vorhandenen "true"-Werte. "Leere" Einträge werden nicht mitgezählt, so dass ich in der Beispieldatei ein korrektes Ergebnis erhalte.

SELECT Null,Count([v1]) AS [AnzahlVonv1],Count([v2]) AS [AnzahlVonv2],Count([v5]) AS [AnzahlVonv5] FROM [BeispielDiagramme]; 

Aber: In der Originaldatenbank (gleiche Tabelle, identischer Code) werden auch die vermeintlich "leeren" Felder mitgezählt! Der Code funktioniert hier also nicht. Scheinbar werden hier die leeren Felder nicht als leer erkannt. Kann man das über den Code anpassen? Evtl. auch so, dass man sagt "zähle" nur die "true"-Felder?


Zusatzfrage: Ich möchte die Achsenbeschriftung von "AnzahlVonv1" verändern in z.B. "Variable 1". Über eine Änderung  im Code hat es nur funktioniert, wenn ich z.B. schreibe

SELECT Null,Count([v1]) AS ["Variable 1"],nicht jedoch
SELECT Null,Count([v1]) AS [v1],Allerdings möchte in der Achsenbeschriftung keine "" stehen haben, die zweite Variante funktioniert so aber leider nicht.

Gruß

DF6GL

Hallo,


grundsätzlich:

Vermeide Sonder- und Leerzeichen in Namen.

Nutze Datentyp "Ja/Nein" für boolsche Variablen/Felder. 


Zitatwerden hier die leeren Felder nicht als leer erkannt.

Die "vx"-Tabellenfelder sind vom Datentyp TEXT. Zudem sind Leerstrings bei der Eingabe erlaubt. So kann es passieren, dass ein Leerstring im Tabellenfeld steht, und ein Leerstring ist nun mal nicht NULL...



ZitatSELECT Null,Count([v1]) AS [v1]

Hier kommt der Aliasname mit dem Tabellenfeldnamen in Konflikt.




ZitatSELECT Null,Count([v1]) AS ["Variable 1"],

Kannst Du Dich hier nicht mit Variable1  arrangieren?


Trick 17:


Schreibe bei Variable 1


anstelle des Leerzeichens ein hartes Leerzeichen (Tasten  <alt gr> + 255) und lass die Gänsefüße weg.

BikeArno

Zitat von: DF6GL am April 10, 2021, 11:40:12Die "vx"-Tabellenfelder sind vom Datentyp TEXT. Zudem sind Leerstrings bei der Eingabe erlaubt. So kann es passieren, dass ein Leerstring im Tabellenfeld steht, und ein Leerstring ist nun mal nicht NULL...

Danke vielmals für die Hinweise. Aber wiese funktioniert das Auszählen der "true"-Werte dann in der hochgeladenen Beispieldatei; jedoch nicht in meiner Originaldatenbank, wo ich es benötige? Also muss es ja scheinbar doch möglich sein, lediglich die "true"-Werte im Balkendiagramm anzeigen zu lassen. Ich habe statt NULL auch Nz probiert, änderte aber nichts. Kann man denn nicht im Code konkret die "true"-Werte ansprechen und auszählen? Die Daten bekomme ich leider in dieser Form von extern.

DF6GL

Hallo,


dies:

ZitatDie "vx"-Tabellenfelder sind vom Datentyp TEXT. Zudem sind Leerstrings bei der Eingabe erlaubt. So kann es passieren, dass ein Leerstring im Tabellenfeld steht, und ein Leerstring ist nun mal nicht NULL...

hast Du vermutlich nicht gelesen oder nicht verstanden.


NZ() wirkt nur auf Felder mit "Inhalt" NULL  (in Wirklichkeit ist NULL kein Inhalt..)


Wenn ein Leerstring als Inhalt auftreten kann, so muss dies in der Abfrage berücksichtigt werden, bzw. Du zählst nur die DS (Felder), die den Text "true" als Inhalt haben.


ZitatSELECT Null AS Ausdr1, Count([v1]="true") AS ["Variable 1"], Count([v2]="true") AS AnzahlVonv2, Count([v3]="true") AS AnzahlVonv3, Count([v4]="true") AS AnzahlVonv4, Count([v5]="true") AS AnzahlVonv5
FROM BeispielDiagramme
WHERE (((BeispielDiagramme.[KriteriumA]) Like "A"));



markus888

Ich sehe ihr seid schon etwas weiter gekommen.

Zitat von: BikeArno am April 10, 2021, 10:56:42Was mich ratlos macht: Ich habe die Ursprungstabelle für die Beispieldatei in eine neue Access-DB importiert - und siehe da, hier funktioniert u.g. Code, d.h. er zählt tatsächlich nur die vorhandenen "true"-Werte. "Leere" Einträge werden nicht mitgezählt, so dass ich in der Beispieldatei ein korrektes Ergebnis erhalte.

SELECT Null,Count([v1]) AS [AnzahlVonv1],Count([v2]) AS [AnzahlVonv2],Count([v5]) AS [AnzahlVonv5] FROM [BeispielDiagramme]; 

Aber: In der Originaldatenbank (gleiche Tabelle, identischer Code) werden auch die vermeintlich "leeren" Felder mitgezählt!

Du musst verstehen wie Count(Feld) arbeitet.

Wenn man ein Feld angibt, wird der Inhalt des Feldes nicht ausgewertet.
In der Datenbank hat jedes Feld hat ein zusätzliches Bit-Feld in dem steht, ob der Feldwert Null ist.
Es wird also nur dieses Bit-Feld ausgewertet und alles gezählt, dass nicht Null ist.

Wenn man einen Ausdruck verwendet, müsste dieser also dafür sorgen, dass alle Werte die nicht zu zählen sind Null zurückgeben.

Hier ein Beispiel:

SELECT NULL
 ,Count(IIf([d].[v1] = 'true', [d].[v1], NULL)) AS [v1]
FROM [qryDatensatz] AS d;

Besser ist es natürlich für "brauchbare" Daten zu sorgen.
Dann vermeidest du den unnötigen Mehraufwand bei der Datenspeicherung und der Auswertung.
Denn ein True/False Feld benötigt 2 Bit.
Ein Textwert "True" benötigt ohne Index zumindest 41/81 Bit in der Datenbank.
10 Jahre Access

DF6GL

Hallo,

m. E liegt das Problem einfach darin, dass als "leer" (NULL) erscheinende Felder nicht leer sind, sondern ein Leerzeichen (bzw. ein anders nicht sichtbares Zeichen) enthalten oder vorhergehend nicht auf NULL, sondern auf "" gesetzt wurden....

Ist, wie erwähnt, im Tabellenfeld auch ein Leerstring (Leere Zeichenfolge) erlaubt, so ist das Feld eben nicht "leer" und wird mitgezählt  bei Count([Tabellenfeld]).


Mein SQL-Beispiel ist vielleicht etwas unklar.

Der Ausdruck Count([v1]) untersucht wohl, ob [v1] NULL oder nicht NULL ist...  Aber prüft eben nur auf NULL.

Count(*) macht gar keine dedizierte Feld-Prüfung, das Resultat ist lediglich die DS-Anzahl entspr. der Where-Condition.

Bei Count([v19] = "false") ist false völlig überflüssig. Es wird hierbei nicht mit einem Literalstring verglichen, sondern der Ausdruck gibt lediglich einen Wert (und nicht "NULL") zurück, wenn das Feld nicht leer ist.

Man könnte das auch als  "Ist nicht NULL" bezeichnen.


Count([V1]) , Count([v1] = "xyz") , Count([v1] ="")  ist gleichbedeutend im Ergebnis.

Einen Unterschied macht es jedoch, wenn wie oben beschrieben, eine leere Zeichenfolge  für das jeweilige Feld zugelassen ist und das Feld nicht den Zustand NULL annimmt, obwohl es scheinbar "leer" ist.





BikeArno

Zitat von: markus888 am April 11, 2021, 11:13:43Hier ein Beispiel:

Code [Auswählen] Erweitern
SELECT NULL
 ,Count(IIf([d].[v1] = 'true', [d].[v1], NULL)) AS [v1]
FROM [qryDatensatz] AS d;

Besser ist es natürlich für "brauchbare" Daten zu sorgen.

Hallo Markus,

danke, dieser Code funktioniert tatsächlich. Darf ich nochmal fragen, wwelche Rolle "(IIf([d]..." dabei übernimmt?

Ich denke, Franz hat mit seiner Ausführung auch recht; ohne diesen Code-Einschub, zählt mir Access stur die Datensätze ohne Rücksicht, ob im Feld "true" oder "false" oder "nichts" steht...

Aber den Mehraufwand nehme ich gerne in Kauf...

Also nochmal vielen Dank allen Beteiligten!

markus888

Zitat von: BikeArno am April 12, 2021, 17:37:40Darf ich nochmal fragen, wwelche Rolle "(IIf([d]..." dabei übernimmt?

d ist ein Tabellen-Alias.
Dadurch kannst du v1 als Feld Alias verwenden.

Hier eine Abhandlung zum Thema:

https://codekabinett.com/rdumps.php?Lang=1&targetDoc=sql-as-alias

Hier ein allgemeiner SQL Link:

https://www.sql-und-xml.de/sql-tutorial/
10 Jahre Access