Mai 17, 2021, 12:40:25

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


SLQ-Code anpassen Diagramm

Begonnen von BikeArno, Februar 20, 2021, 09:55:34

⏪ vorheriges - nächstes ⏩

BikeArno

Guten Tag ins Forum,

ich versuche ein Diagramm in einem Access-Bericht zu erstellen. Dieses baut momentan auf eine gesamte Abfrage auf. Nun will ich dieses Diagramm jedoch nur auf einen Teil des Datensatzes aufbauen. Ich dachte, dazu kann ich einfach den Code im Eigenschaftsblatt unter Datensatzherkunft anpassen, bekomme es aber nicht hin. Der Code soeht momentan so aus:

TRANSFORM Count(*) AS [Anzahl] SELECT [qry_PBAT].[Land] FROM [qry_UB] GROUP BY [qry_PBAT].[Land] PIVOT [Status];
Nun möchte ich den Code z.B. so anpassen, dass das Diagramm nur auf Datensätze aufbaut, die in der ID beginnen mit "WK.00.*" (es gibt WK.00.123 bis WK.19.123).

Geht das? Ich habe es über Where-Clausel probiert, aber ich bin zu ungeübt...

Danke schonmal, falls jemand sein Wissen teilen möchte :-)

DF6GL

Hallo,



zunächst ist ID-Feld (Primärschlüssel) vom Datentyp TEXT nicht sehr hilfreich und sollte den Datentyp LONG besitzen.


Versuch es so:

TRANSFORM Count(*) AS [Anzahl] SELECT [qry_PBAT].[Land] FROM [qry_UB] Where ID Like "WK.00.*"  GROUP BY [qry_PBAT].[Land] PIVOT [Status]

BikeArno

Super, das funktioniert! Danke vielmals.
Danke für den Hinweis mit der ID, da muss ich dir völlig recht geben; leider wurde die ID von andere Stelle mit Buchstabenkombinationen versehen ...

Beaker s.a.

Hallo Arno,
Zitatwurde die ID von andere Stelle mit Buchstabenkombinationen versehen
Was aber nicht heisst, dass du dieses Feld auch als PK verwenden musst.
Das ist einfach ein zum PK (Autowert, Long) zusätzliches Feld mit einem
eindeutigen Index.

Wenn das Feld von "aussen" kommt (importiert wird) würde ich es i.Ü. beim
Import auch in atomare Inhalte aufteilen. Damit entgehst du auch den Problemen,
die du in dem anderen Thread mit diesem Feld hast.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

BikeArno

Hallo nochmal ins Forum,

ich habe ein weiteres Problem bei der Erstellung eines Diagramms in einem Access-Bericht, welches sicherlich zu lösen ist, wenn man weiß wie:

Und zwar habe ich zwei relevante Felder als Grundlage:
v_Alter = Zahlen von 1 bis 100
v_Mitglied = ja/nein

Ich möchte das Alter gruppiert in einem Tortendiagramm darstellen, WENN v_Mitglied = ja.

Bisher habe ich das Alter nur ungruppiert darstellen können

SELECT [v_Alter],Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied Like "ja"  GROUP BY [v_Alter];
Frage: Wie muss ich den Code gestalten, um das Alter im Diagramm wie folgt zu gruppieren:
1-25, 26-50, 51-75 und 76 bis 100?

Freue mich über Hilfe.

Beaker s.a.

Hallo Arno,
Zitatv_Mitglied = ja/nein
Ist das wirklich ein Feld vom Typ "Text" (String)?
Für einen Wahrheitswert gibt es den Typ "Ja/Nein" (Boolean).
Dann entfällt auch dieses bescheuerte ('Tschuldigung) LIKE ohne
Joker.
SELECT [v_Alter],Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY [v_Alter];(-1 = "Ja", 0 = "Nein")
ZitatWie muss ich den Code gestalten, um das Alter im Diagramm wie folgt zu gruppieren:
Dazu wirst du wohl eine Tabelle benötigen, die die Altersgruppen
bereitstellt. Zur Verwendung dieser Tabelle schaust du mal hier

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

BikeArno

Hallo,

danke. Kann man diese Gruppierung nicht doch irgendwie direkt im Code vornehmen, ohne zusätzliche Tabellen?

Dank und Gruß

crystal

Hallo,
es könnte mit einer globalen Funktion klappen, definiert in einem Modul:
public function Altersgruppe(Alter as long) as long
   select case alter
      case < 26:
         Altersgruppe = 1
      case < 51:
         Altersgruppe = 2
      case < 76:
         Altersgruppe = 3
      case else:
         Altersgruppe = 4
   end select
end function
und im SELECT:
SELECT Altersgruppe([v_Alter]) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY AG;

Oder noch einfacher ohne globale Funktion:
SELECT int(([v_Alter]+24)/25) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY AG;

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

BikeArno

Danke crystal, klingt eigentlich alles logisch. Funktioniert bei mir aber nicht.
Das Diagramm wird unverändert ausgegeben. Mein Vorgehen war:

Ich habe ein neues Modul geöffnet:
Public Function Altersgruppe(v_Alter As Long) As Long
   Select Case Altersgruppe
      Case Is < 25:
         Altersgruppe = 1
      Case Is < 50:
         Altersgruppe = 2
      Case Is < 75:
         Altersgruppe = 3
      Case Else:
         Altersgruppe = 4
   End Select
End Function

Im Eigenschaftsblatt habe ich bei Datensatzherkunft des Diagramms eingegeben:
Select Altersgruppe([v_Alter]) as AG, Count (*) As [Anzahl] FROM [qry_Datensatz] GROUP BY AG;
Die "Mitgliedschaft" (WHERE-Code) habe ich der Einfachheit wegen erstmal weggelassen.

Das Diagrammm zeigt nun gar keine Daten mehr aus meinem Datensatz an, sondern die Original Microsoft-Daten der Northwind-Datenbank...

Der zweite (einfachere) Code funktionierte bei mir leider auch so nicht... Bestimmt mache ich was falsch?

ebs17

Vielleicht so.
SELECT
   (v_Alter - 1) \ 25 AS AG,
   MIN(v_Alter) AS UG,
   MAX(v_Alter) AS OG,
   COUNT(*) AS Anzahl
FROM
   qry_Datensatz
WHERE
   v_Mitglied = True
GROUP BY
   (v_Alter - 1) \ 25
Mit freundlichem Glück Auf!

Eberhard

BikeArno

Hallo,

auch damit gehts leider nicht.

ebs17

Ich sag mal so: Mit einer eigenen Zahlentabelle zeigte sich bei mir ein "gehen".
Über eigene Gestaltungen, auch rundherum, muss sich jeder eigene Gedanken machen.

Es ist ja auch eine Abfrage und keine Diagrammgestaltung.
Mit freundlichem Glück Auf!

Eberhard

crystal

Hallo BikeArno,

also die Query selbst funktioniert bei mir, auch die Version mit INT...
Allerdings habe ich kein Diagramm getestet. Prüfe doch mal, welche Daten aus der Query im Diagramm benutzt werden.

Daten aus der Northwind-DB werden angezeigt??? Die können ja nicht "irgendwoher" kommen. Also bitte prüfe die Datenquelle deines Diagramms nochmal genau. Und teste die Abfrage mal direkt. Wenn du im Abfrage-Generator unten im "Feld:" die rechte Maustaste klickst, kannst du die Formel aufbauen... Wichtig sind die Klammern:
SELECT INT(([v_Alter]+24)/25) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY AG;
          ^^            ^  ^

Und sorry - richtig muss es so lauten:

SELECT INT(([v_Alter]+24)/25) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY INT(([v_Alter]+24)/25);


Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

BikeArno

Zitat von: crystal am März 05, 2021, 13:17:18Und sorry - richtig muss es so lauten:

SELECT INT(([v_Alter]+24)/25) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where v_Mitglied = -1  GROUP BY INT(([v_Alter]+24)/25);


Hallo cystal,

dieser Code funktioniert, d.h. er gruppiert das Alter tatsächlich. Bin begeistert, Danke!

Nun würde ich gern die Logik dahinter verstehen. Als Ergebnis erhalte ich durch die Formel [(Alter + 24)/25] offenbar 4 Ganzzahlen, die das Alter kategorisieren in <=25, 26 bis 50, 51 bis 75 usw, richtig? Wie kann ich mir diesbezüglich die Funkionsweise der o.g. Codes vorstellen? Wenn ich vom Alter 0 bis 100 Jahre ausgehe, komme ich auf eine Spannweite von 0,96 bis 4,96. 

Wie müsste denn der Code beispielsweise verändert werden, wenn ich eine Gruppierung in 10er Schritten haben möchte (0 bis 9 Jahre, 10 bis 19, 20 bis 29 usw.)? Vielleicht wird es dann für mich deutlicher.

Abschließend, aber wichtig: Kann ich die im Diagramm angezeigten errechneten gruppierten Zahlen auch als Text wiedergeben (also statt 1 "unter 26", 2 = "..." usw.)?

Grüße

crystal

Hallo,
du hast natürlich Recht: meine Formel gibt für das Alter 0 Gruppe 0 aus (statt 1 wie gewünscht). Obwohl Alter 0 ja wohl eher nicht vorkommt...
Die Berechnung ist ja ganz einfach.
Beispiel: Alter 5 Jahre. 5/25 ergäbe 0,2. Also addieren wir 25 zum Alter, teilen durch 25 und erhalten 1,2. Davon der ganzzahlige Anteil (INT) ist 1.

Eine Formel nach meinem Schema
INT((Alter + (Gruppengroesse-1))/Gruppengroesse) ergibt für Alter 0 eine 0, für Alter 1 bis 25 eine 1, für 26 bis 50 2 usw.

Eine Formel
INT((Alter + Gruppengroesse)/Gruppengroesse) ergibt für für Alter 0 bis 24 eine 1, für 25 bis 49 eine 2 usw.

Willst du also 10er-Gruppen, schreibst du
INT((Alter + 9)/10) und erhälst für 0 bis 9 eine 1, für 10 bis 19 eine 2 usw.
oder
INT((Alter + 10)/10) und erhälst für 0 eine 0, für 1 bis 10 eine 1, für 11 bis 20 eine 2 usw.

Um das Alter 0 doch noch in die erste Gruppe zu "quetschen" könntest du schreiben:
INT((Alter + 10)/10) + (Alter = 0)
Der Ausdruck (Alter = 0) ist entweder wahr (1) oder falsch (0)

Irgendwie ist die Beispiel-Funktion "Altersgruppe" dann doch etwas einfacher zu verstehen...

Nicht vergessen: der jeweils komplette Ausdruck muss auch als GROUP BY erscheinen.

Im Diagramm würde ich die Altersgruppen-Bezeichnungen einfach so lassen und stattdessen eine entsprechende Legende einfügen, z. B.:
1: < 25
2: 25 bis 49
3: 50 bis 79
4: 75 bis 99
bzw.
1: 0 bis 10
2: 11 bis 20
3: 21 bis 30
usw.

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...