PDA

View Full Version : Durschnitt via SQL



Jenne
07-11-08, 10:56
Hallo Kollegen,

ich habe folgendes Problem:

ich habe eine Datei in der alle unsere Rechnungen stehen, mit Rechnungsnr., Tour, Kundennr. usw.
In einer Tour sind mehrere Rechnungen eines Kunden und mehrere Kunden.

Ich möchte jetzt folgendes ermitteln.
Die durchschnittliche Anzahl von Aufträgen pro Tour eines Kunden, als Summe aller Kunden.

Ich bekomme immer nur die Anzahl der Touren oder Anzahl der Kunden oder die Anzahl der Rechnungen.

Gruß
Jenne

eagle
07-11-08, 11:12
Hi,

SELECT Tour ,AVG(Aufträge) FROM Rechnungen
GROUP BY Kunde

So müsstest du schonmal die durchschnittliche Anzahl aller Aufträge mit Angabe der Tour haben gruppiert nach Kunden.

mfg

Jenne
07-11-08, 14:24
Hallo Eagle,

die Select-Anweisung mit AVG(Aufträge) funktioniert so nicht, da ich die Spalte Aufträge nicht habe.

Gruß
Jenne

Fuerchau
08-11-08, 17:37
Hier hilft nur die berühmte CTE (CommonTableExpression).
Beispiel:

wirh xCountAuf as (
select Kunde, Tour, count(distinct AuftrNum) as AuftrCount
from Rechnungen
group by Kunde, Tour
)

select Kunde, Tour, avg(AuftrCount)
from xCountAuf
group by Kunde, Tour

Die Feldnamen musst du natürlich anpassen.
In der CTE wird je Kunde und Tour die Anzahl eindeutiger Auftragsnummern (oder was auch immer) gezählt und nach Kunde und Tour summiert "count(distinct xxx)".

Im 2. Schritt wird dann vom Zwischenergebnis (der CTE) eben der Durchschnitt gerechnet.

BenderD
09-11-08, 08:33
äquivalent zur Hugo Klausel:

select Kunde, Tour, avg(AuftrCount)
from (
select Kunde, Tour, count(distinct AuftrNum) as AuftrCount
from Rechnungen
group by Kunde, Tour
) Hugo
group by Kunde, Tour


Hier hilft nur die berühmte CTE (CommonTableExpression).
Beispiel:

wirh xCountAuf as (
select Kunde, Tour, count(distinct AuftrNum) as AuftrCount
from Rechnungen
group by Kunde, Tour
)

select Kunde, Tour, avg(AuftrCount)
from xCountAuf
group by Kunde, Tour

Die Feldnamen musst du natürlich anpassen.
In der CTE wird je Kunde und Tour die Anzahl eindeutiger Auftragsnummern (oder was auch immer) gezählt und nach Kunde und Tour summiert "count(distinct xxx)".

Im 2. Schritt wird dann vom Zwischenergebnis (der CTE) eben der Durchschnitt gerechnet.

Jenne
10-11-08, 08:22
Danke Ihr Zwei,

beide Varianten haben geklappt. ich bekomme jetzt für jeden Kunden einen Durchschnitt in der jeweiligen Tour. Jetzt habe ich nur noch eine Frage:

Wenn ich jetzt alle Ergebnisse zusammen addiere und druch die Anzahl teile, habe ich die durchschnittliche Anzahl Rechnungen aller Kunden in allen touren in einer Summe.

Bekomme ich das auch mit Eurem SQL-Statement hin.

Gruß
jenne

Fuerchau
10-11-08, 08:52
Das muss ich jetzt nicht verstehen !?
Meinst du vielleicht folgendes ?

with xCountAuf as (
select Kunde, Tour, count(distinct AuftrNum) as AuftrCount
from Rechnungen
group by Kunde, Tour
)
, xKdTour as (
select Kunde, Tour, avg(AuftrCount) as AvgCount
from xCountAuf
group by Kunde, Tour
)
select sum(AvgCount), count(*), sum(AvgCount) / count(*)
from xKdTour

Jenne
10-11-08, 09:06
Danke Fuerchau,

genau das war es.


Gruß
Jenne