none
Kreuztabelle erstellen mit Prozentzahlen ( oder Anteilen) RRS feed

  • Frage

  • PARAMETERS DatumVon DateTime, DatumBis DateTime;
    SELECT zzBordbuch.Pilot, Count(zzBordbuch.ID) AS AnzahlvonID, Sum(Round([Hours_Dec],2)) AS Stunden, Count(zzBordbuch.Landungen) AS AnzahlvonLandungen, round(Avg([Hours_Dec]),2) AS Flugdauer_durchschnittl
    FROM zzBordbuch WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]))
    GROUP BY zzBordbuch.Pilot;
    
    UNION SELECT "Gesamt" as test,Count([id]) AS GesamtFluege, Sum([hours_dec]) AS Gesamtstunden, Sum([landungen]) AS GesamtLandungen, Avg(Round([Hours_Dec],2)) AS Flugdauer_durchschnittl
    
    FROM zzBordbuch
    WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]));
    

    Mit obigem SQL-Text versuche ich eine Nutzungsstatistik  zu erstellen. Der Ansatz ist aber m.S. nicht optimal.

    Das funktioniert auch so einigermassen als das der Kreuztabellenteil mir brav für jeden Nutzer die Anzahl der Stunden, der Flüge und Landungen ausgibt. Auch wird die durchschnittl. Dauer der Flüge pro Nutzer ermittelt.

    Was dei Kreuztabelle nicht leistet ist, mir anteilig z.B. die je Nutzer genutzten Stunden in Bezug auf die Gesamtnutzung auszurechnen.

    Dafür habe ich den UNION-Teil gemacht, der korrekt die Gesamtzahl der Stunden usw. errechnet.

    1. Ich hätte gerne eine Spalte "Stunden/Gesamtstunden*100"

    2. Die AVG-Spalte rundet nicht korrekt auf 2 Stellen - warum?

    3. Der Where-Teil sollte flexibler sein um pauschal ein YTD zu machen oder letztes Jahr oder aktuelles Quartal oder so. Gibt es dafür typische Lösungen ?

    Donnerstag, 17. Oktober 2019 11:12

Antworten


  • Hallo,

    PARAMETERS DatumVon DateTime, DatumBis DateTime;
    SELECT zzBordbuch.Pilot, Count(zzBordbuch.ID) AS AnzahlvonID, Sum(Round([Hours_Dec],2)) AS Stunden, Count(zzBordbuch.Landungen) AS AnzahlvonLandungen, round(Avg([Hours_Dec]),2) AS Flugdauer_durchschnittl
    FROM zzBordbuch WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]))
    GROUP BY zzBordbuch.Pilot;
    
    UNION SELECT "Gesamt" as test,Count([id]) AS GesamtFluege, Sum([hours_dec]) AS Gesamtstunden, Sum([landungen]) AS GesamtLandungen, Avg(Round([Hours_Dec],2)) AS Flugdauer_durchschnittl
    
    FROM zzBordbuch
    WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]));

    [...]

    1. Ich hätte gerne eine Spalte "Stunden/Gesamtstunden*100"


    Dazu müssten die Gesamtstunden in jeder Zeile wiederholt werden, d.h. Unterabfrage statt UNION.

    2. Die AVG-Spalte rundet nicht korrekt auf 2 Stellen - warum?

    Was bedeutet "nicht korrekt"? Kommen mehr oder weniger als 2 Stellen raus? Stimmt das Ergebnis nicht?

    3. Der Where-Teil sollte flexibler sein um pauschal ein YTD zu machen oder letztes Jahr oder aktuelles Quartal oder so.

    Das kannst du per DatumVon und DatumBis steuern, z.B. als Steuerelemente eines Startformulars für die Ausgabe.

    Gibt es dafür typische Lösungen ?

    In der Tat. Man trennt grundsätzlich Abfrage und Darstellung, d.h. die Punkte 1 und 2 sollten im Bericht, dem die Abfrage zugrunde liegt, gemacht werden. Dafür gibt es auch Funktionen.

    Zu Punkt 1: Falls es in der Abfrage sein soll (d.h. eine intensive und langsame Lösung):

    AS Stunden, Sum([Hours_Dec])/(SELECT Sum([hours_dec]) FROM zzBordbuch)*100 AS Anteil, ...

    Zu Punkt 2: Siehe FAQ 2.1. Die Onboard-Round-Funktion arbeitet nach dem sog. Bankers Rounding. 

    Gruss - Peter



    Mitglied im www.dbdev.org
    Access-FAQ: www.donkarl.com
    Access in Docs: https://docs.microsoft.com/en-us/office/vba/api/overview/access/?WT.mc_id=M365-MVP-10319


    Freitag, 18. Oktober 2019 15:12
    Moderator

Alle Antworten


  • Hallo,

    PARAMETERS DatumVon DateTime, DatumBis DateTime;
    SELECT zzBordbuch.Pilot, Count(zzBordbuch.ID) AS AnzahlvonID, Sum(Round([Hours_Dec],2)) AS Stunden, Count(zzBordbuch.Landungen) AS AnzahlvonLandungen, round(Avg([Hours_Dec]),2) AS Flugdauer_durchschnittl
    FROM zzBordbuch WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]))
    GROUP BY zzBordbuch.Pilot;
    
    UNION SELECT "Gesamt" as test,Count([id]) AS GesamtFluege, Sum([hours_dec]) AS Gesamtstunden, Sum([landungen]) AS GesamtLandungen, Avg(Round([Hours_Dec],2)) AS Flugdauer_durchschnittl
    
    FROM zzBordbuch
    WHERE (((zzBordbuch.[datum])>[DatumVon] And (zzBordbuch.[datum])<[DatumBis]));

    [...]

    1. Ich hätte gerne eine Spalte "Stunden/Gesamtstunden*100"


    Dazu müssten die Gesamtstunden in jeder Zeile wiederholt werden, d.h. Unterabfrage statt UNION.

    2. Die AVG-Spalte rundet nicht korrekt auf 2 Stellen - warum?

    Was bedeutet "nicht korrekt"? Kommen mehr oder weniger als 2 Stellen raus? Stimmt das Ergebnis nicht?

    3. Der Where-Teil sollte flexibler sein um pauschal ein YTD zu machen oder letztes Jahr oder aktuelles Quartal oder so.

    Das kannst du per DatumVon und DatumBis steuern, z.B. als Steuerelemente eines Startformulars für die Ausgabe.

    Gibt es dafür typische Lösungen ?

    In der Tat. Man trennt grundsätzlich Abfrage und Darstellung, d.h. die Punkte 1 und 2 sollten im Bericht, dem die Abfrage zugrunde liegt, gemacht werden. Dafür gibt es auch Funktionen.

    Zu Punkt 1: Falls es in der Abfrage sein soll (d.h. eine intensive und langsame Lösung):

    AS Stunden, Sum([Hours_Dec])/(SELECT Sum([hours_dec]) FROM zzBordbuch)*100 AS Anteil, ...

    Zu Punkt 2: Siehe FAQ 2.1. Die Onboard-Round-Funktion arbeitet nach dem sog. Bankers Rounding. 

    Gruss - Peter



    Mitglied im www.dbdev.org
    Access-FAQ: www.donkarl.com
    Access in Docs: https://docs.microsoft.com/en-us/office/vba/api/overview/access/?WT.mc_id=M365-MVP-10319


    Freitag, 18. Oktober 2019 15:12
    Moderator
  • Danke!

    Das hat die Lösung gebracht.

    Dienstag, 22. Oktober 2019 14:29