Avatar billede hunter1978 Nybegynder
19. maj 2004 - 09:30 Der er 16 kommentarer og
1 løsning

Problem med gennemsnit ud fra en bestemt dag (datetime)

Hej
Har to spørgsmål :)
1. Har en tabel ’WMControlResults’, som løbende bliver opdateret med data.
Har ønsker jeg så at få gennemsnit, min, max værdier og antal målinger for forskellige ’typer’, ud fra forskellige parameter
-1 time, 1 døgn, 1 måned og 1 år. Men hvordan skal SQL’en for det se ud?
SELECT avg(værdi) FROM WMControlResults WHERE type='Effekt' AND ???;

2. Desuden ønsker jeg at gemme disse hver 24 time,  i en anden tabel ’WMControlResults, for derefter at slette dataen i WMControlResults. Så ’WMControlResults’ virker som en slags buffer. Det med at der bliver spurgt hver døgn klares inde fra min kode.

Min tabeler ser således ud:
create table WMControlResults (
millId int,
dato datetime,
type String,
Værdi double,
Enhed String,
fejl String,
primary key (millId,dato,type),
foreign key (millId) references WMControlMill(millId)
);

create table WMControlStatistics (
statisticsID counter,
millId int,
dato datetime,
type String,
værdiMin double,
værdiMax double,
værdiGen double,
enhed String,
fejl String,
antal int,
primary key (statisticsId, millId),
foreign key (millId) references WMControlMill (millId)
);
Avatar billede jensen363 Forsker
19. maj 2004 - 09:57 #1
Eksempel ( gruppering på dagsniveau og timeniveau :

SELECT Format([oprettelsesdato],"dd/mm/yyyy") AS Dato,
Format([oprettelsesdato],"hh") AS [time],
Sum(tblData.beløb) AS SumOfbeløb
FROM tblData
GROUP BY Format([oprettelsesdato],"dd/mm/yyyy"), Format([oprettelsesdato],"hh");
Avatar billede jensen363 Forsker
19. maj 2004 - 10:04 #2
Benyt

INSERT INTO WMControlResults

hvis du vil gemme resultaterne i en anden tabel
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 10:12 #3
Min 'Type' som er en string er jo forskellig f.eks Effekt, nyttevirkning, vindhastighed. Så den skal jo defineres.
SELECT avg(værdi) FROM WMControlResults WHERE type='Effekt'
Men hvis jeg nu ønsker gennemsnit fra igår d.18 hvordan gør jeg det?
Avatar billede jensen363 Forsker
19. maj 2004 - 10:20 #4
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Avg(WMControl.Værdi) AS GennemsnitOfVærdi
FROM WMControl
WHERE (((WMControl.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=18-5-2004));
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 10:58 #5
Tak for svarene...
Men er ikke helt med :(
Lad os sige at jeg har disse dater i min WMControlResults tabel:
1, 5/18/2004 3:23:20 PM, Effekt, 7.5, m/s, null
1, 5/18/2004 5:24:20 PM, Effekt, 8.5, m/s, null
1, 5/18/2004 9:25:20 PM, Effekt, 5.5, m/s, null
1, 5/18/2004 3:26:20 AM, Effekt, 2.5, m/s, null
1, 5/18/2004 3:26:21 AM, Vindstyrke, 2.5, m/s, null
1, 5/19/2004 3:26:20 AM, Effekt, 2.5, m/s, null
Så vil jeg gerne have følgende: min, max, avg og antal(målinger), ud fra den 18 maj 2004(i går).
Hvor type er ’effekt’. Vil gerne have et dynamisk kald da det altid er dagen før jeg henter data fra.
min = 2,5
max = 8.5
avg = 6
antal = 4
Disse vil jeg så gerne have skrevet over i min WMControlStatistics tabel
Autonumber , 1 , 5/18/2004 , Effekt , 2,5 , 8,5 , 4 , m/s, null , 4
Herefter vil jeg gerne slette data fra den 18. maj hvor type=effekt fra WMControlStatistics.
Avatar billede jensen363 Forsker
19. maj 2004 - 11:06 #6
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Avg(WMControl.Værdi) AS avg
FROM WMControl
WHERE (((WMControl.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Min(WMControl.Værdi) AS Min
FROM WMControl
WHERE (((WMControl.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Max(WMControl.Værdi) AS Max
FROM WMControl
WHERE (((WMControl.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Count(WMControl.Værdi) AS Antal
FROM WMControl
WHERE (((WMControl.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1));
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 11:30 #7
Hej igen. Mange tak fordi du tager dig tid til dette her :)
Når jeg skriver det du har skrevet, har lige rettet det ene tabel navn fra WMContro til WMControlResults. Bliver jeg bedt om at give WMControlResults.Værdi en parameter value.
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Avg(WMControlResults.Værdi) AS avg
FROM WMControlResults
WHERE (((WMControlResults.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Min(WMControlResults.Værdi) AS Min
FROM WMControlResults
WHERE (((WMControlResults.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION
SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Max(WMControlResults.Værdi) AS Max
FROM WMControlResults
WHERE (((WMControlResults.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1))
UNION SELECT Format([dato],"dd/mm/yyyy") AS DatoNiveau, Format([dato],"hh") AS TimeNiveau, Count(WMControl.Værdi) AS Antal
FROM WMControlResults
WHERE (((WMControlResults.type)="Effekt"))
GROUP BY Format([dato],"dd/mm/yyyy"), Format([dato],"hh")
HAVING (((Format([dato],"dd/mm/yyyy"))=Date()-1));
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 11:34 #8
Er der en måde så man kan gøre den dynamisk, så SQL Strengen er ens hver dag man bruger den? -eller det er den måske allerede?
Avatar billede jensen363 Forsker
19. maj 2004 - 11:44 #9
Du mangler vist lige at rette Count(WMControl.Værdi) AS Antal.
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 11:50 #10
ahh den har jeg også lige selv fundet :)
Når jeg så køre querien for jeg en tabel, men 3 rækker.
DatoNiveau, TimeNiveau og avg, men den er tom.
burde jeg ikke også at få fire rækker?
-Jeg ønsker jo max, min, avg og antal målinger.
Avatar billede jensen363 Forsker
19. maj 2004 - 11:57 #11
Har du "tomme" værdier i dine målinger ?
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 12:00 #12
Nej, jeg har ca 11.000 records. Er der en måde jeg kan sende dig min db på?
Avatar billede jensen363 Forsker
19. maj 2004 - 12:04 #13
zip den lige, og send den til ose@post.dk
Avatar billede hunter1978 Nybegynder
19. maj 2004 - 12:11 #14
Det lyder fint, den er sent :)
Avatar billede jensen363 Forsker
19. maj 2004 - 12:29 #15
Sendt retur ...

Det næste du så skal gøre, for at kunne benytte resultaterne videre, skulle være dette :

TRANSFORM Sum(test_II.Resultat) AS SumOfResultat
SELECT test_II.DatoNiveau, test_II.TimeNiveau
FROM test_II
GROUP BY test_II.DatoNiveau, test_II.TimeNiveau
PIVOT test_II.ID;
Avatar billede jensen363 Forsker
19. maj 2004 - 16:41 #16
Følgende løsning indarbejdet ( modul ):

Option Compare Database

Function GenererStatistik()
Dim Msg, Style, Title, Ctxt, Response
Dim strSQL As String
Dim db As DAO.Database

    Msg = "Du har valgt at generere statistik for : " & Date - 1 & " Vil du fortsætte ?"
    Style = vbYesNo + vbCritical + vbDefaultButton2
    Title = "Statistikgenerering"
    Ctxt = 1000
    Response = MsgBox(Msg, Style, , Title, Ctxt)
   
    If Response = vbYes Then
       
    Set db = CurrentDb()

    strSQL = "INSERT INTO WMControlStatistics "
    strSQL = strSQL & "( millId, dato, type, værdiMin, værdiMax, værdiGen, enhed, fejl, antal ) "
    strSQL = strSQL & "SELECT WMControlResults.millId, "
    strSQL = strSQL & "Format([dato],""dd/mm/yyyy"") AS DatoNiveau, "
    strSQL = strSQL & "WMControlResults.type, "
    strSQL = strSQL & "Min(WMControlResults.Værdi) AS værdiMin, "
    strSQL = strSQL & "Max(WMControlResults.Værdi) AS værdiMax, "
    strSQL = strSQL & "Avg(WMControlResults.Værdi) AS værdiGen, "
    strSQL = strSQL & "WMControlResults.Enhed, "
    strSQL = strSQL & "WMControlResults.fejl, "
    strSQL = strSQL & "Count(WMControlResults.type) AS Antal "
    strSQL = strSQL & "FROM WMControlResults "
    strSQL = strSQL & "GROUP BY WMControlResults.millId, "
    strSQL = strSQL & "Format([dato],""dd/mm/yyyy""),"
    strSQL = strSQL & "WMControlResults.Type , "
    strSQL = strSQL & "WMControlResults.Enhed, "
    strSQL = strSQL & "WMControlResults.fejl "
    strSQL = strSQL & "HAVING (((Format([dato],""dd/mm/yyyy""))=Date()-1));"

    db.Execute strSQL
   
    strSQL = "DELETE Format([dato],""dd/mm/yyyy"") AS DatoNiveau "
    strSQL = strSQL & "FROM WMControlResults "
    strSQL = strSQL & "WHERE (((Format([dato],""dd/mm/yyyy""))=Date()-1));"
   
    db.Execute strSQL

        Else
   
    MsgBox ("Du har valgt at afbryde statistikgenereringen.")
   
    End If


End Function
Avatar billede hunter1978 Nybegynder
24. maj 2004 - 09:51 #17
Hej Lasse.
Så fik jeg det til at virke :)
Takker mage gange.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester