Mai 17, 2021, 15:11:16

Neuigkeiten:

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


SLQ-Code anpassen Diagramm

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

⏪ vorheriges - nächstes ⏩

BikeArno

Zitat von: crystal am März 07, 2021, 09:56:37Gruß,
crystal

Hallo crystal,

vielen Dank für die Super-Erklärung, das hilft mir wirklich weiter, die Dinge auch zu verstehen, statt nur zu kopieren!

Gruß

crystal

@BikeArno
Danke für dein Lob! Es freut mich, dass ich dir helfen konnte und du etwas lernen konntest!

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

Hallo,

ich hätte eine weitere kleine Frage zum Thema Diagrammaufbau in Access. Und zwar habe ich eine Tabelle mit zwei relevanten Feldern: Bundesland und Ausgaben, ungefähr 3.000 Datensätze. Ich möchte nun mittels Balkendiagramm pro Bundesland den Mittelwert der Ausgaben als Balken ausgeben lassen. Funktioniert das mittels Code, oder kann man das in Access vergessen? Derzeit sieht der Code so aus, liefert aber nicht das gewünschte Resultat: 

SELECT [Bundesland],Count([Ausgaben]) AS [MittelwertVonAusgaben] FROM [qry_Datensatz] GROUP BY [Bundesland];
Würde mich über Tipps freuen.

Gruß

BikeArno

März 12, 2021, 13:51:10 #18 Letzte Bearbeitung: März 12, 2021, 15:13:35 von BikeArno Grund: Zusatzaspekt
Hallo,

ich möchte nochmal auf folgenden Code eingehen:

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);

Diese gruppiert das Alter. Naturgemäß ist dieses ja auch begrenzt, sodas der Code super klappt.
Wie ist es aber, wenn ich andere Variablen/Felder gruppieren möchte, die eine sehr große Streuung mit Ausreisern aufweisen, wobei ich letztere in eine separate Gruppe stecken möchte.

Beispiel: Umfang von Unterrichtsstunden in Fortbildungen. So hat in meinem Fall die Mehrheit einen Stundenumfang von 0 bis 100 Stunden. Ca. 1% aller Fälle hat jedoch Stunden von über 1.000. Folgende Gruppierung böte sich da an:

0 Stunden
1-10
11-20
...
91-100
über 100 Stunden

Kann man die Formel oben entsprechend anpassen, oder ist das nicht möglich?

Nachsatz: Alternativ habe ich versucht, den Zahlenbereich für die Gruppierung einzugrenzen, so dass der Stundenumfang im Datensatz nich mehr von 0 bis 20.000, sondern nur noch bis 100 geht. Auch dieser Code funktioniert nicht :-(

SELECT INT(([Stunden]+9)/10) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where Stunden < 100 GROUP BY INT(([Stunden]+9)/10)
Ich grübel den halben Tag und finde keine Lösung...
Danke

Beaker s.a.

Hallo Arno,
Count()zählt die DS, die der Bedingung entsprechen
Sum() summiert, und
Avg() bildet den Mittelwert

Auf den Rest hab ich jetzt keine Lust.

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

März 13, 2021, 11:48:25 #20 Letzte Bearbeitung: März 13, 2021, 14:28:53 von BikeArno Grund: Zusatzfrage, wollte kein neues Thema öffnen
Danke Ekkehard,

1. mit dem Mittelwert habe ich es wie folgt versucht, mit dem Ziel ein einfaches Balkendiagramm zu bekommen, welches den Mittelwert eines Feldes ausweist, klappt nicht. Wo könnte der Fehler liegen?

SELECT [Stunden], AVG(*) AS [Mittelwert] FROM [qry_Datensatz] GROUP BY [Stunden];

2. Zu dem oben angesprochenen Thema: Wie begrenze ich den zu gruppierenden Wertebereich der Zahlen, irgendwas mache ich hier falsch:

SELECT INT(([Stunden]+9)/10) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where Stunden < 100 GROUP BY INT(([Stunden]+9)/10)
Wie gesagt, der Wertebereich der Daten geht von 0 bis mehrere 1.000 (Ausreißer oder Fehleingaben). Die möchte ich nicht mir in die Gruppierung einschließen, da mittels der o.g. Formel für jeden Ausreißer separate Gruppen gebildet werden... Ich möchte nur Fälle zählen im Wertebereich 0 bis 100.

Das muss doch irgendwie machbar sein...

Gruß

crystal

Hallo,
nochmal ganz einfach.
Mit einer Formel wie oben INT(...) wird der Zahlenstrahl (z. B. Alter von 0 bis 100) linear in gleich große Stücke geteilt. Um nun für ein Balkendiagramm zu zählen, wie viele Alter in jeder dieser Stücke fallen, muss man - eben - die Anzahlen zählen (Count). Mit AVG würdest du den Mittelwert aller Alter in dem betreffenden Stück erhalten. Das wird oft auch gleichzeitig in einem Diagramm dargestellt.

Um nun einen Zahlenstrahl in ungleich große Stücke zu teilen, kommst du mit so einer einfachen Formel nicht weiter. Da hilft m. E. nur eine Funktion, die das macht. Code nochmal, korrigiert:

public function Altersgruppe(Alter as long) as long
  select case alter
      case < 26:
        Altersgruppe = 1
      case < 51:
        Altersgruppe = 2
      case < 76:
        Altersgruppe = 3
      case < 101:
        Altersgruppe = 4
      case else:
        Altersgruppe = 5
  end select
end function
und im SELECT:

SELECT Altersgruppe([v_Alter]) as AltersGr, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where (v_Mitglied = -1)  GROUP BY Altergruppe([v_Alter]);

Alles was älter als 101 ist, wird im obigen Beispiel in Gruppe 5 gezählt.

Ändere doch mal deinen Code
SELECT INT(([Stunden]+9)/10) as AG, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where Stunden < 100 GROUP BY INT(([Stunden]+9)/10)
so
SELECT INT(([Stunden]+9)/10) as Stundengruppe, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where ([Stunden] < 100) GROUP BY INT(([Stunden]+9)/10)

Hier ist es oft hilfreich, im Abfrage-Generator zwischen Entwurfs- und SQL-Ansicht hin- und herzuschalten, damit die eckigen und runden Klammern richtig gesetzt werden. Oft hilft es auch, sich mal die Tabellen-Ansicht anzuschauen und ggf. noch ein paar Felder zeitweise hinzuzufügen.

Da du aber in deinen Beispielen die Abkürzung "AG" immer unverändert übernommen hast, vermute ich, dass du nicht weißt, was "AG" überhaupt bedeuten soll (stand ursprünglich einfach nur für "ArbeitsGruppe"). Auch scheint es so zu sein, dass du den Abfrage-Generator nicht benutzt, da die Klammersetzungen immer gleich sind.

Deine Idee, die Mittelwerte als Balkendiagramm darzustellen ist natürlich falsch. Balken dienen immer dazu, Anzahlen darzustellen.

Schließlich: eine Aussage wie "klappt nicht" ist wenig hilfreich. Du solltest schon beschreiben, was genau nicht klappt, ob Syntaxfehler gemeldet werden oder oder.

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

Hallo crystal,

vielen Dank für deine hilfreichen Erklärung. Den Abfragegenerator habe ich bisher nicht genutzt, das stimmt...

Ich werde deine Hinweise einmal testen. Aber: Bisher habe ich den Code bzw. die o.g. Formel lediglich im Eigenschaftenblatt / Datensatzherkunft des jeweiligen Diagramms eingetragen. Deshalb ist mir leider nicht klar, wo ich die von dir oben ausgeführte Altersgruppen-Funktion

public function Altersgruppe(Alter as long) as long
[...]

hinterlegen muss. Muss ich da im ersten Schritt zunächst ein Modul mit dieser Funktion erstellen und dann im nächsten Schritt den SELECT wie gehabt im Eigenschaftenblatt hinterlegen?

Der zweite Code

SELECT INT(([Stunden]+9)/10) as Stundengruppe, Count(*) AS [Anzahl] FROM [qry_Datensatz] Where ([Stunden] < 100) GROUP BY INT(([Stunden]+9)/10)
"funktioniert" bei mir nicht. Das heisst, wenn ich das Diagramm aus der Entwurfsansicht in die Berichtsansicht umstelle, bleibt es unverändert wie zuvor (die Änderungen wirken sich also nicht aus).Fehlermeldungen gibt es keine.

Und zuletzt: Deine Anmerkung mit dem Mittelwert im Balkendiagramm klingt plausibel. Dann gibt es vermutlich keine Möglichkeit, den Mittelwert mittels einfacher Formel als Diagramm anzuzeigen, oder doch?

Nochmal vielen Dank... Gruß

crystal

März 14, 2021, 11:38:51 #23 Letzte Bearbeitung: März 14, 2021, 11:47:59 von crystal
Hallo,
Vorbemerkung: ich dachte immer an Excel-Diagramme. Leider ist die Diagramm-Funktionalität in Access-Berichten etwas anders und sehr "gewöhnungsbedürftig"...

Das klappt bei mir:
SELECT Int(([Stunden]+9)/10) AS Stundengruppe, Count(*) AS Anzahl
FROM Tabelle1
WHERE ((([Stunden])<100))
GROUP BY Int(([Stunden]+9)/10);

Und als zweites Diagramm im Bericht (Typ Linie):
SELECT Int(([Stunden]+9)/10) AS Stundengruppe, Avg(Stunden) AS Mittel
FROM Tabelle1
WHERE (((Stunden)<100))
GROUP BY Int(([Stunden]+9)/10);

Sie dürfen in diesem Board keine Dateianhänge sehen.

Da das zweite Diagramm nicht sehr aussagekräftig ist, würde ich im Bericht wohl eher eine Tabelle der Mittelwerte darstellen.

Blöderweise steht im Diagramm "Sum of Anzahl", eigentlich müsste es "Anzahl" heißen. Ist leider etwas schwierig, das zu ändern, weil dann der SQL-Select "verhunzt" wird.

Vielleicht hat jemand mehr Erfahrung mit der schrecklichen Bedien-Oberfläche der Diagramm-Eigenschaften...

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

März 14, 2021, 12:00:36 #24 Letzte Bearbeitung: März 14, 2021, 13:31:04 von BikeArno Grund: Versuch, Problem verständlicher zu beschreiben
Hallo crystal,

danke für die Tipps. Es klingt alles plausibel, aber es funktioniert bei mir nicht. Vielleicht gehe ich falsch vor? Mein Vorgehen:

1. Ich habe im Microsoft VBA-Editor folgenden angepassten Code eingegeben:

Public Function Stundengruppe(Stunden As Long) As Long
  Select Case Stundengruppe
      Case Is < 26:
        Stundengruppe = 1
      Case Is < 51:
        Stundengruppe = 2
      Case Is < 76:
        Stundengruppe = 3
      Case Is < 101:
        Stundengruppe = 4
      Case Else:
        Stundengruppe = 5
  End Select
End Function

2. Dann habe im Eigenschaftenblatt des Access-Berichts (Datensatzherkunft) folgenden Code hinterlegt:

SELECT Stundengruppe([Stunden]) as StundenGr, Count(*) AS [Anzahl] FROM [qry_Datensatz] GROUP BY Stundengruppe([Stunden]);
Ergebnis: Keins. Diagramm wird unverändert angezeigt.
 
Da ich diese Funktion öfters benötige, würde ich gerne verstehen, wie ich das selbständig anwende. Wo könnte mein Fehler liegen?


Nachtrag: Der folgende o.g. Code führt leider auch nicht zum gewünschten Ergebnis, der Datensatz wird also nicht eingegerenzt:
SELECT Int(([Stunden]+9)/10) AS Stundengruppe, Count(*) AS Anzahl
FROM Tabelle1
WHERE ((([Stunden])<100))
GROUP BY Int(([Stunden]+9)/10);

Gruß

DF6GL

Hallo,

der Code ist falsch und sollte so lauten:

Public Function Stundengruppe(Stunden As Long) As Long
  Select Case Stunden
      Case Is < 26:
        Stundengruppe = 1
      Case Is < 51:
        Stundengruppe = 2
      Case Is < 76:
        Stundengruppe = 3
      Case Is < 101:
        Stundengruppe = 4
      Case Else:
        Stundengruppe = 5
  End Select
End Function

BikeArno

Zitat von: DF6GL am März 14, 2021, 13:57:09der Code ist falsch und sollte so lauten:

Hallo,

vielen Dank für den Hinweis. Das stimmt zwar  (mein Versehen), aber das Ganze führt trotz Korrektur immer noch n icht zum Erfolg.
Ich frage mich, ob mein oben beschriebenes (siehe #24) Vorgehen richtig ist? Oder wie würdet ihr das angehen?

 

DF6GL

Hallo,

am besten setzt Du einen Haltepunkt an den Anfang des Codes und prüft was genau denn da abläuft..

Zum eigentlichen Problem will ich jetzt nichts beitragen, da wurde schon viel erzählt.

BikeArno

Nach setzen des Haltepunktes im Code und Einzelschrittdurchlauf öffnet sich lediglich ein Fenster "Makros", welches leer ist. In der Zeile Makroname steht nichts.

Ich habe auch ein neues Modul mit identischem Code angelegt, mit gleichem Ergebnis.

Wenn ich das Diagramm vom Entwurfsmodus in den Berichtsmodus umschalte, rödelt Access zwar, aber der Code führt nicht zu den Änderungen. Wenn ich im Entwurfsmodus einen Doppelklick auf das Diagramm ausübee (es öffnet sich u.a. die Datentabelle), sieht man auch, dass der Code nicht zum Erfolg führt, denn dort steht noch immer "AG" (aus dem vorherigen Code) statt "Stundengruppe" (aus dem aktuellen Code).

Gruß

DF6GL

Hallo,

das scheint noch mehr im Argen zu liegen...



Wenn möglich, lade die Db hier hoch, datenreduziert, komprimiert/repariert und gezippt.

Ich weiß allerdings nicht, ob ich (selber) dazu komme, alles anzusehen.