/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL: opbygning af statistik statement
Fra : P.E. Nikolajsen


Dato : 08-11-06 22:03

Nej
Jeg har en record med to datoer: en for indmelding og en en for udmelding.
Nu kan jeg godt tænke mig at opbygge en statistik der ser således ud:

måned el uge - antal indmeldte - antal udmeldte - evt en saldo

Det eneste jeg kan finde på er noget med at opbygge en temporer tabel med
følgende struktur:

dato, ind (0 el 1), ud (0 el 1)

og så summer på disse, grupperet på datoen.

Og nu til spørgsmålet:
Vil dette kunne lade sig gøre uden at brugeren har ret til oprettelse af
tabeller? (hvilket jeg af sikkerhedsmæssige grunde er betænkelig ved)

eller findes der en anden smart måde at bygge SQL-statementet op på??

Mvh
PE



 
 
Jens Gyldenkærne Cla~ (08-11-2006)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 08-11-06 23:29

P.E. Nikolajsen skrev:

> måned el uge - antal indmeldte - antal udmeldte - evt en saldo
>
> Det eneste jeg kan finde på er noget med at opbygge en
> temporer tabel med følgende struktur:
>
> dato, ind (0 el 1), ud (0 el 1)

Det skulle ikke være nødvendigt med en temp-tabel. Det er simpelt
nok at tage indmeldte eller udmeldte for sig:

SELECT Year(indmeldt) as Aar, Month(indmeldt) As Maaned,
   COUNT(*) AS AntalIndmeldte
FROM tabel
GROUP BY Aar, Maaned

SELECT Year(udmeldt) as Aar, Month(udmeldt) As Maaned,
   COUNT(*) AS AntalUdmeldte
FROM tabel
GROUP BY Aar, Maaned

For at lægge dem sammen i et enkelt postsæt, kan man i princippet
benytte et FULL OUTER JOIN - men det understøtter MySQL vist ikke.
I stedet kan følgende være en mulighed:

SELECT d.*, i.antalIndmeldte, u.AntalUdmeldte
FROM
(
   SELECT Year(indmeldt) as Aar, Month(indmeldt) As Maaned,
   FROM tabel
   UNION
   SELECT Year(udmeldt) as Aar, Month(udmeldt) As Maaned,
   FROM tabel
) d
LEFT JOIN
(
   SELECT Year(indmeldt) as Aar, Month(indmeldt) As Maaned,
       COUNT(*) AS AntalIndmeldte
   FROM tabel
   GROUP BY Aar, Maaned
   ) i
ON d.Aar = i.Aar AND d.Maaned = i.Maaned
LEFT JOIN
(
   SELECT Year(udmeldt) as Aar, Month(udmeldt) As Maaned,
       COUNT(*) AS AntalUdmeldte
   FROM tabel
   GROUP BY Aar, Maaned
) u
ON d.Aar = u.Aar AND d.Maaned = u.Maaned

ORDER BY d.Aar, d.Maaned


Jeg ved ikke hvad du mener med saldo, men hvis det differencen
mellem ind- og udmeldte, er det bare at tilføje beregningen i
selectlisten:

SELECT d.*, i.antalIndmeldte, u.AntalUdmeldte,
   i.antalIndmeldte - u.antalUdmeldte AS medlemstilgang

Der skal nok også laves en konvertering af NULL => 0 i beregningen.
I MSSQL kan det gøres med ISNULL(feltnavn, 0) - jeg ved ikke hvad
man gør i Mysql.


Ovenstående viser kun måneder/år hvor der er indmeldt eller udmeldt
mindst én person. Hvis tomme måneder også skal med, skal man lave
en select der udvælger alle de ønskede datoværdier, og benytte den
som basistabellen for LEFT JOIN.
--
Bolig søges. Andel eller leje i Emdrup, Nordvest, Nørrebro, Søborg
eller Brønshøj, max 6000 pr. måned.
Kontakt pr. mail - nospam(at)gyros.dk
Jens Gyldenkærne Clausen

P.E. Nikolajsen (09-11-2006)
Kommentar
Fra : P.E. Nikolajsen


Dato : 09-11-06 18:26

Tak for hjælpen.




Søg
Reklame
Statistik
Spørgsmål : 177455
Tips : 31962
Nyheder : 719565
Indlæg : 6408144
Brugere : 218879

Månedens bedste
Årets bedste
Sidste års bedste