Discussion:
Spaltensumme in Abfrage zu Prozentberechnung verwenden geht nicht
(zu alt für eine Antwort)
Marcus Exner
2005-02-07 18:10:50 UTC
Permalink
Hallo NG!

Ich will in einer Abfrage mit drei Spalten eine weitere hinzufügen in
der die Dauer als Prozentualer Anteil von der Gesammtdauer steht...


Datum | Kundenname | Dauer | Dauern in Prozent


Wenn ich jetzt in der Abfrage schreibe:
Prozent: [Dauer]/Summe([Dauer])

meckert Access das ich 'Datum' nicht als Teil der Agregatfunktion
einschliesse.
Was soll den des? Ich will da noch nix Gruppieren oder sonst wie
verwursten, des Datum soll einfach ignoriert werden. (Später will ich
dann ne Kreuztabelle damit füttern um Monatsspalten zu bekommen. Mit
Kundename als Zeile. (Kundenname kommt aus ner anderne Tabelle, wir
deswegen diese Spalte nicht auch bemängelt?)

Lösung?

Vielen Dank
Marucs
Karl Donaubauer
2005-02-07 19:36:50 UTC
Permalink
Post by Marcus Exner
Ich will in einer Abfrage mit drei Spalten eine weitere hinzufügen in
der die Dauer als Prozentualer Anteil von der Gesammtdauer steht...
Datum | Kundenname | Dauer | Dauern in Prozent
Prozent: [Dauer]/Summe([Dauer])
meckert Access das ich 'Datum' nicht als Teil der Agregatfunktion
einschliesse.
Was soll den des? Ich will da noch nix Gruppieren oder sonst wie
verwursten, des Datum soll einfach ignoriert werden. (Später will ich
dann ne Kreuztabelle damit füttern um Monatsspalten zu bekommen. Mit
Kundename als Zeile. (Kundenname kommt aus ner anderne Tabelle, wir
deswegen diese Spalte nicht auch bemängelt?)
Lösung?
Mitgehangen, mitgefangen. Sobald du in einer Abfrage in einer
Spalte eine Aggregatfunktion verwendest, musst du auch den
anderen anzuzeigenden Spalten eine verpassen oder nach
ihnen gruppieren. Wenn du das nicht willst, kannst du DSum
verwenden, also:
Prozent: [Dauer]/DSum("Dauer";"DeineTabelle")

Für %e evtl. auch noch *100, aber das merkst du dann eh.
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Marcus Exner
2005-02-08 12:27:35 UTC
Permalink
On Mon, 7 Feb 2005 20:36:50 +0100, "Karl Donaubauer"
Post by Karl Donaubauer
Post by Marcus Exner
Ich will in einer Abfrage mit drei Spalten eine weitere hinzufügen in
der die Dauer als Prozentualer Anteil von der Gesammtdauer steht...
Datum | Kundenname | Dauer | Dauern in Prozent
Prozent: [Dauer]/Summe([Dauer])
meckert Access das ich 'Datum' nicht als Teil der Agregatfunktion
einschliesse.
Was soll den des? Ich will da noch nix Gruppieren oder sonst wie
verwursten, des Datum soll einfach ignoriert werden. (Später will ich
dann ne Kreuztabelle damit füttern um Monatsspalten zu bekommen. Mit
Kundename als Zeile. (Kundenname kommt aus ner anderne Tabelle, wir
deswegen diese Spalte nicht auch bemängelt?)
Lösung?
Mitgehangen, mitgefangen. Sobald du in einer Abfrage in einer
Spalte eine Aggregatfunktion verwendest, musst du auch den
anderen anzuzeigenden Spalten eine verpassen oder nach
ihnen gruppieren. Wenn du das nicht willst, kannst du DSum
Prozent: [Dauer]/DSum("Dauer";"DeineTabelle")
Für %e evtl. auch noch *100, aber das merkst du dann eh.
Danke!

Mit DSum hatte ich sogar schon probiert aber in der Onlinehilfe stehen
statt den Strichpunkten als Trennzeichen Kommas und das er da nen
String mit Anführungszeichen bei den Namen will hab ich auch ned
gewusst. Deswegen habe ich den weg ned weiter verfolgt weils mir zu
blöde war, aber so gehts jetzt.
Karl Donaubauer
2005-02-08 12:44:57 UTC
Permalink
Post by Marcus Exner
...
Mit DSum hatte ich sogar schon probiert aber in der Onlinehilfe stehen
statt den Strichpunkten als Trennzeichen Kommas
...
Die Kommas sind quasi englisch und schon richtig, aber für andere Orte.
Das siehst du, wenn du in die SQL-Ansicht der Abfrage wechselst,
und man muss sie auch bei DSum im VBA-Code verwenden.
An der "deutschen" Access-Oberfläche hingegen muss man den
Strichpunkt nehmen und wird DSum automatisch in "DomSumme"
übersetzt, weil das viel verständlicher und einleuchtender ist, oder so.
--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Josef Poetzl
2005-02-08 12:39:33 UTC
Permalink
Hallo!
Post by Karl Donaubauer
Post by Marcus Exner
Prozent: [Dauer]/Summe([Dauer])
meckert Access das ich 'Datum' nicht als Teil der Agregatfunktion
einschliesse.
[...]
Post by Karl Donaubauer
Mitgehangen, mitgefangen. Sobald du in einer Abfrage in einer
Spalte eine Aggregatfunktion verwendest, musst du auch den
anderen anzuzeigenden Spalten eine verpassen oder nach
ihnen gruppieren. Wenn du das nicht willst, kannst du DSum
Prozent: [Dauer]/DSum("Dauer";"DeineTabelle")
Nur so als Zwischenfrage:
Sollte folgende SQL-Anweisung nciht schneller laufen?

SELECT
T.Dauer,
T.Dauer / S.GesamtDauer AS InProzent
FROM
Tabelle AS T,
(Select Sum(Zahlenfeld) AS GesamtDauer FROM Tabelle) AS S

mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Josef Poetzl
2005-02-08 12:43:18 UTC
Permalink
Post by Josef Poetzl
Sollte folgende SQL-Anweisung nciht schneller laufen?
SELECT
T.Dauer,
T.Dauer / S.GesamtDauer AS InProzent
FROM
Tabelle AS T,
(Select Sum(Zahlenfeld) AS GesamtDauer FROM Tabelle) AS S
Zahlenfeld = Dauer
Wenn man schon von einer bestehenden Abfrage kopiert, sollte man
wenigstens die Feldnamen richtig verwenden. ;-)

Hier noch einmal richtig gestellt:
SELECT
T.Dauer,
T.Dauer / S.GesamtDauer AS InProzent
FROM
Tabelle AS T,
(Select Sum(Dauer) AS GesamtDauer FROM Tabelle) AS S


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Karl Donaubauer
2005-02-08 12:59:08 UTC
Permalink
Hallo, Josef!
Post by Josef Poetzl
Post by Josef Poetzl
Sollte folgende SQL-Anweisung nciht schneller laufen?
...
SELECT
T.Dauer,
T.Dauer / S.GesamtDauer AS InProzent
FROM
Tabelle AS T,
(Select Sum(Dauer) AS GesamtDauer FROM Tabelle) AS S
Joo, oder kürzer:
SELECT
Dauer,
Dauer / (Select Sum(Dauer) AS GesamtDauer FROM Tabelle)
FROM
Tabelle

Da wirst schon selber messen müssen. ;-)
Nach meiner Erfahrung sind Unterabfragen mit JET nicht
wirklich Boliden, und würde es mich nicht wundern, wenn
DSum schneller wäre.
--
cu
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
Josef Poetzl
2005-02-08 13:45:00 UTC
Permalink
Hallo!
Post by Josef Poetzl
Post by Josef Poetzl
Post by Josef Poetzl
Sollte folgende SQL-Anweisung nciht schneller laufen?
...
SELECT
T.Dauer,
T.Dauer / S.GesamtDauer AS InProzent
FROM
Tabelle AS T,
(Select Sum(Dauer) AS GesamtDauer FROM Tabelle) AS S
SELECT
Dauer,
Dauer / (Select Sum(Dauer) AS GesamtDauer FROM Tabelle)
FROM
Tabelle
Da wirst schon selber messen müssen. ;-)
:-)
Post by Josef Poetzl
Nach meiner Erfahrung sind Unterabfragen mit JET nicht
wirklich Boliden, und würde es mich nicht wundern, wenn
DSum schneller wäre.
Ich habe zwar keine Zeitmessung durchgeführt, aber hier mein
subjektiver Eindruck nach dem Öffnen und zum letzten-DS-Springen:

Für obige Problemstellung ist es egal ob DSum, Unterabfrage oder join.

Anders sieht es bei Gruppierungen aus.

Beispiel:
Tabelle tTestDaten (~130000 DS)
- idTestDaten
- fiGruppe (~500 Gruppen)
- Zahl_Long1

Variante 1:
SELECT
T.Zahl_Long1,
T.Zahl_Long1 / S.GruppenSumme AS InProzent
FROM
tTestDaten AS T
INNER JOIN
(Select fiGruppe, Sum(Zahl_Long1) AS GruppenSumme
FROM tTestDaten Group By fiGruppe) AS S
ON T.fiGruppe = S.fiGruppe;

Variante 2:
SELECT
T.Zahl_Long1,
T.Zahl_Long1 / (Select Sum(Zahl_Long1)
FROM tTestDaten AS T1
WHERE T1.fiGruppe = T.fiGruppe ) AS InProzent
FROM tTestDaten AS T

Variante 3:
SELECT
T.Zahl_Long1,
T.Zahl_Long1 / DSum("Zahl_Long1",
"tTestDaten",
"fiGruppe=" & T.fiGruppe) AS InProzent
FROM tTestDaten AS T


Hier ist eindeutig Variante 1 am schnellsten.
Ich vermute deshalb, weil bei Variante 1 und 2 die Unterabfrage für
jeden DS ausgeführt wird.

Interessant dabei ist noch:
Bei Variante 2 werden die ersten Ergebnisse schnell angezeigt, das
Wechseln zum letzten DS dauert aber "sehr lange".
Bei Variante 3 (DSum) dauert die Anzeige der ersten Ergebnisse etwas
länger (man kann dabei zusehen wie die Felder gefüllt werden), dafür
geht das Wechseln zum letzten DS sehr flott.


mfg
Josef
--
EPT: (Access Error Prevention Table) http://access.joposol.com/
FAQ: (Access-FAQ von Karl Donaubauer) http://www.donkarl.com/
Loading...