Avatar billede dr_nielsen Nybegynder
24. april 2002 - 20:39 Der er 48 kommentarer og
1 løsning

Opsummere poster

Jeg står med målerdata der er indtastet på dato
Jeg har flere end en måler

Hvorledes lægger jeg feks alle data sammen der er indtastet på datoer

eks.

Måler  Jan  Feb  Mar
A      100  200  120
B      300  500  400
c      400  100  300
Sum    800  800  820

Det er altså summen jeg er intereseret i.

:: Nielsen 
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 20:40 #1
der er selvfølgelig
en tabel med (aflæsning, dato, MålerID) og
en med målerene (MålerID, MålerNummer, Måler)
Avatar billede arriva Nybegynder
24. april 2002 - 20:47 #2
sum = 0
do until rs.eof
sum = sum + rs("målerværdi")
rs.movenext
loop
Avatar billede arriva Nybegynder
24. april 2002 - 20:47 #3
Men kommer selvfølgelig an på om du mener alle fra en dato, eller hvordan?
Avatar billede arriva Nybegynder
24. april 2002 - 20:48 #4
eller skal din Sql sætning bare være noget lign. Sql = "Select * from Målere Where Dato = f.eks. 'Feb'" og så den anden =)
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 20:48 #5
Eks

Resultat jan, feb, mar for alle tre målere
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 20:49 #6
(sum linien)
Avatar billede eagleeye Praktikant
24. april 2002 - 20:55 #7
hm jeg ville benytte den udemærket sum fuinction SQL stiller til rådighed:

sql="SELECT SUM(kolonne1) As SumKolonne1 FROM tabel WHERE dato = 'JAN'"
set rs = connection.execute(sql)

og udkrive sådan her:
Response.write "Summen for XXX er " & rs("SumKolonne1") & "KW/h ."
Avatar billede arriva Nybegynder
24. april 2002 - 20:59 #8
ja, self. doh ! :)
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:01 #9
tester 2 sec :)
Avatar billede eagleeye Praktikant
24. april 2002 - 21:03 #10
der skal nok lige en måler id med:


sql="SELECT SUM(aflæsning) As SumAflæsning FROM tabel WHERE dato = 'JAN' AND MålerID = 'A'"
set rs = connection.execute(sql)
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:08 #11
ok nyt issue, det der ligger i basen er ikke forbrug, det er aflæsninger.
Lige nu udregnes forbrug inden det præsenteres.

eks.
ForbrugFeb = ForbrugJan
ForbrugJan = rs("ForbrugsAflaesning")
AkuForbrug = (ForbrugFeb - ForbrugJan) * MalerFaktor

så jeg tror ikke at sum går

Er det mon noget Array gymnastik jeg skal ud i
Avatar billede eagleeye Praktikant
24. april 2002 - 21:21 #12
Det er aflæsninger som er i basen...
skal du stadig ligges sammen på tværs af målere?

men det bliver noget med at lave flere SQL sætniger og gemme resultaterne.
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:24 #13
sounds funkie, der må næsten være en generisk måde at gøre det på ?!
Avatar billede eagleeye Praktikant
24. april 2002 - 21:27 #14
Denne SQL:

sql = "SELECT DISTINCTROW dato, Sum(aflæsning) AS SumAflæsning FROM tabel GROUP BY dato;"

giver et recordset som dette:
dato : SumAflæsning
JAN : 800
FEB : 800
MAR : 820
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:28 #15
kanon, vil du kort forklare DISTINCTROW
Avatar billede eagleeye Praktikant
24. april 2002 - 21:29 #16
der skal nok en ORDER BY  for at sikre det mindste tal kommer først:

sql = "SELECT DISTINCTROW dato, Sum(aflæsning) AS SumAflæsning FROM tabel GROUP BY dato ORDER BY Sum(aflæsning);"
Avatar billede eagleeye Praktikant
24. april 2002 - 21:30 #17
Så kan man udkrive sådan her:
Response.write "Total aflæsning " & rs("dato") & " er " & rs("SumAflæsning")
lastAflæsning = rs("SumAflæsning")
rs.movenext
Response.write "Total aflæsning " & rs("dato") & " er " & rs("SumAflæsning")
Response.write "Forbrug for " & rs("dato") & " er " & rs("SumAflæsning") - lastAflæsning
Avatar billede eagleeye Praktikant
24. april 2002 - 21:33 #18
DISTINCTROW tager kun en rækker En gang hvis den går igen flere gange.... Det skulle bare være DISTINVT som tager en kolonne med hvis den findes flere gange.. Men jeg har lige prøvet at teste SQL'en i Access og den er faktisk ikke nødvendig...:

Så dette skulle være nok:
sql = "SELECT dato, Sum(aflæsning) AS SumAflæsning FROM tabel GROUP BY dato ORDER BY Sum(aflæsning);"
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:35 #19
tester ....zzzzz.......
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 21:48 #20
Det sidste virkede
SELECT Forbrugsdato, Sum(forbrugsaflaesning) AS Summen
FROM forbrug
GROUP BY Forbrugsdato
ORDER BY Summen

og vi nærmer os. så jeg tilføjer lige en dimension til

der er flere målertyper feks, varme og el med hver deres målere

så bemærk målertype (int[1,2,3,4 ..])
Aflæsninger :: (aflæsning, dato, MålerID)
Måler ::      (MålerID, MålerNummer, Måler, MålerType)

Så tabellen maler skal med ;}
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:02 #21
Disse virker, men hvordan kan jeg parre dem

' viser de målere jeg vil have fat i
SELECT MalerID
FROM Maler
WHERE MalerType = 1

'viser data, og skulle ´gerne gøre det for ovenstående målere
SELECT Forbrugsdato, Sum(forbrugsaflaesning) AS Summen
FROM forbrug
GROUP BY Forbrugsdato
ORDER BY Summen
Avatar billede eagleeye Praktikant
24. april 2002 - 22:02 #22
Ok.. men hvordan skal måler komme ind i billet?

Hvis man sætter målerID på får du jo den oprindelige tabel ud. Eller kan der være flere målinger på samme måler i samme måned?
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:04 #23
Eller kan der være flere målinger på samme måler i samme måned?
Nej, men der kan feks være flere varmemålere der aflæses hver måned.
Og jeg ønsker det samlede forbrug, hen over alle målere
Avatar billede eagleeye Praktikant
24. april 2002 - 22:06 #24
Ok så hvis målerID = A er det eksvis alle varmemålinger...
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:08 #25
ja
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:08 #26
nej- målertype, ikke måler id
Avatar billede eagleeye Praktikant
24. april 2002 - 22:10 #27
Prøv denne SQL, den sammentæller hvor målerID = A:

sql="SELECT Forbrugsdato, malerID, Sum(forbrugsaflaesning) AS Sumforbrugsaflaesning FROM forbrug WHERE malerID = 'A' GROUP BY Forbrugsdato, malerID ORDER BY Sum(forbrugsaflaesning);"
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:17 #28
Dette er resultatet
2002-01-01 00:00:00 1    1000   
2002-02-01 00:00:00 1    2200   
2002-03-03 00:00:00 1    4000
2002-04-01 00:00:00 1    4536

Det er desværre kun aflæsninger og ikke summen af dem   

Det skal iøvrigt være MalerType ='A' ikke malerid = 'A'

Den er ret tricky, jeg sidder med noget select i select.

"Vælg summen af aflæsninger fra forbrug hvor maler.malertype = 'A'..", men jeg får det ikke helt til at spille
Avatar billede eagleeye Praktikant
24. april 2002 - 22:20 #29
arh nu jeg med på hvordan du bruger maler .. 2 sek prøve r lige noget andet..
malerID : MålerType
1        A
2        B
3        A

og i forbrug
MålerID  : aflæst
1          110
2          100
3          120

så men målertype = skal summen give 130 (1+3) er det rigtig?
Avatar billede eagleeye Praktikant
24. april 2002 - 22:20 #30
med målertype = A altså..
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:22 #31
ja, 230 mente du vist :)
Avatar billede eagleeye Praktikant
24. april 2002 - 22:24 #32
ja... jeg skal vist havde lidt skolepenge tilbage :)
Avatar billede eagleeye Praktikant
24. april 2002 - 22:26 #33
Måske der skal være noget i denne stil du søger:

"SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning, maler.malerType, forbrug.frobrugsdato FROM forbrug RIGHT JOIN maler ON forbrug.malerID = maler.malerID GROUP BY maler.malerType, forbrug.frobrugsdato ORDER BY maler.malerType, forbrug.frobrugsdato;"
Avatar billede eagleeye Praktikant
24. april 2002 - 22:28 #34
Du kan også putte en WHERE ind for at vælge en bestem målertype:

SQL = "SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning, maler.malerType, forbrug.frobrugsdato FROM forbrug RIGHT JOIN maler ON forbrug.malerID = maler.malerID WHERE maler.malerType = 1 GROUP BY maler.malerType, forbrug.frobrugsdato
ORDER BY maler.malerType, forbrug.frobrugsdato;"
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 22:39 #35
Fuck hvor det tæt på.

Lige nu akumulere den alle målerne (perfekt tak)
Men også alle månederne(hvilket jeg skal bruge senere :) )

9100  (jan)
11230 (jan + feb)
12340 (jan + feb + marts)

Er det muligt at få summen månedsvis
Avatar billede eagleeye Praktikant
24. april 2002 - 22:55 #36
denne giver summen månedsvis og målertype vis:

"SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning, maler.malerType, forbrug.frobrugsdato FROM forbrug RIGHT JOIN maler ON forbrug.malerID = maler.malerID GROUP BY maler.malerType, forbrug.frobrugsdato ORDER BY maler.malerType, forbrug.frobrugsdato;"
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 23:01 #37
nej den er magen til '24/04-2002 22:28:42', og den akumullere alle månederne (men den var god nok, den skal jeg bruge senere)

Kanon arbejde, kan du klare denne sidste

Jeg skal bruge situationen:
9100 (jan)
2130 (feb)
1110 (marts)
Avatar billede eagleeye Praktikant
24. april 2002 - 23:04 #38
Måske jeg må lige spørge hvad den kommer af?
Er det en summereing af alle målertyper i en måned eller??
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 23:09 #39
nej, jeg ønsker feks at se det totale varmeforbrug forbrugt af alle varmemålere fordelt på alle måneder

eks (Dette billede skal jeg have frem, og det er sum rækken jeg ikke kan få)
Måler  Jan  Feb  Mar
A      100  200  120
B      300  500  400
c      400  100  300
Sum    800  800  820
Avatar billede eagleeye Praktikant
24. april 2002 - 23:23 #40
Det jeg lige kan komme på er dette men jeg ved ikke helt om jeg misforstår hvordan du ønsker den sidste tabel:

"SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning, forbrug.frobrugsdato FROM forbrug INNER JOIN maler ON forbrug.malerID = maler.malerID WHERE maler.malerType=1 GROUP BY forbrug.frobrugsdato;"

Den ligner meget en af de andre. Du kan nok ikke både så tal og sum i samme SQL....
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 23:30 #41
den retunere det samme som den forrige.

eks

En mand spørger mig:
hvor meget varme bruget vi i januar på vores tre målere. og hvor meget brugte vi i marts.
Jeg vil ikke præsentere ham for hvad vi har brugt indtil nu, men bare det han spørger om.

De to foregående selects du har lavet tjener fint formålet at lægge månedernes forbrug sammen, men ikke at præsentere månederne enkeltvis
Avatar billede eagleeye Praktikant
24. april 2002 - 23:33 #42
For marts skal forbruget være:  SlutMarts - SlutFebruar
Avatar billede dr_nielsen Nybegynder
24. april 2002 - 23:37 #43
ja - exactly
Avatar billede eagleeye Praktikant
24. april 2002 - 23:56 #44
Det jeg er kommet frem til er lidt vildt.... med man skal summere og så trække fra hinanden så det er blvet til nogle select selct..


"SELECT DISTINCT (SELECT SUM(forbrugsaflaesning) AS kol1 FROM forbrug WHERE frobrugsdato = '01-03-02' AND malerID=1) - (SELECT SUM(forbrugsaflaesning) FROM forbrug WHERE frobrugsdato = '01-02-02' AND malerID=1) AS Udtryk1 FROM forbrug;"
Avatar billede dr_nielsen Nybegynder
25. april 2002 - 00:02 #45
ok den biver nok for statisk
jeg fortsætter i morgen.

Point er selvfølgelig dine anyway

Kommer du på noget må du gerne skrive

takker mange gange for lærerigt stof

:: Nielsen
Avatar billede eagleeye Praktikant
25. april 2002 - 00:28 #46
Ja men man kan jo lave noget smart asp kode som bygger SQL op koden skal ud fra ønsket input (Marts 2002, Varmeforbrug) kunne finde StartDato (01-02-02) og SlutDato (01-03-02) og konverter Varmeforbrug til malerType=1, det er relativ let at lave man skal dog huske at tage højde for årsskifte.

Eks.: Jeg ønsker forbrug for Marts 2002. Input kunne være monthStr="Marts" og yearStr="2002" og forbrugstype="varme"

if monthStr = "Marts" then monthNo = "03"
if forbrugstype = "varme" then malerType = 1

SlutDato = "01-" & monthNo & yearStr
monthNo = CInt(monthNo) - 1  'Det skal natuligvis være mere intiligent omkring års skifted.
StartDato = "01-" & monthNo & yearStr


For nu at få alle målere som er varme målere med i udregningen har jeg udvidet SQL'en så den komme til at se sådan ud:

SQL = "SELECT DISTINCT (SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning FROM forbrug INNER JOIN maler ON forbrug.malerID = maler.malerID WHERE frobrugsdato = '" & SlutDato & "' AND maler.malerType=" & malerType & ";) - (SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning FROM forbrug INNER JOIN maler ON forbrug.malerID = maler.malerID WHERE frobrugsdato = '" & StartDato & "' AND maler.malerType=" & malerType & ";) as tallet FROM forbrug;"

udskriv med rs("tallet")


Det bliver jo relative stort. Så Alternativt kan man lave det med to SQL'er:
SQL1 = "hendt varmeforbrug for marts i Tallet"
SQL2 = "hendt varmeforbrug for februar i Tallet"
set rs = connection.execute(SQL1)
tempForbrug = rs("Tallet")
set rs = connection.execute(SQL2)
Forbrug er = tempForbrug  - rs("Tallet")
Avatar billede dr_nielsen Nybegynder
25. april 2002 - 09:23 #47
//eagleeye, tak for indsatsen i går og nat

Jeg endte med at bruge denne

"SELECT Sum(forbrug.forbrugsaflaesning) AS SumOfforbrugsaflaesning, forbrug.frobrugsdato FROM forbrug INNER JOIN maler ON forbrug.malerID = maler.malerID WHERE maler.malerType=1 GROUP BY forbrug.frobrugsdato;"

der resluterer dette:
9100  (jan)
11230 (jan + feb)
12340 (jan + feb + marts)

Hvorefter jeg trak dem fra hinanden ((jan + feb) - (jan)), og det virker perfekt.

tak igen
Avatar billede dr_nielsen Nybegynder
25. april 2002 - 09:26 #48
maler.malerType er selvfølgelig dynamisk
Avatar billede eagleeye Praktikant
25. april 2002 - 17:11 #49
ok :)
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
Kurser inden for grundlæggende programmering

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