Jesper TMedlem sedan nov. 20017 144 inlägg Jag skulle vilja presentera vilka frukter man har ätit aktuell dag och vad de innehåller i gram.
Tabellerna är:
Personer
Id | Namn | A_fett | A_vitamin | A_kolhydrater | A_jarn
ex.
1 | Olle | 510 | 200 | 120 | 240
Frukter
Id | Frukt | B_fett | B_vitamin | B_kolhydrater | B_jarn
ex.
1 | Banan | 45 | 21 | 12 | 14
Kalender
Id | Datum | Frukt_id | Namn_id | Antal
ex.
1 | 98-11-12 | 1 | 1 | 2
Alltså; Olle har ätit två bananer den 12:e november -98
Hur skulle en sådan sql-sats se ut? Går det att lösa på ett smartare sätt?
A_fett osv. innehåller kvoten per dag som Olle får äta.
B_fett osv. innehåller gram fett av 100g. frukt.
Sedan så vill jag ta ut hur mycket fett osv. Olle har ätit i förhållande till sin egen kvot och dag.
Hoppas ni förstår.
LarsGMedlem sedan dec. 200012 464 inlägg select namn,
sum(antal * B_fett) ,
sum( anta*B_vitamin ),
sum(antal * B_kolhydrater),
sum( antal * B_jarn ),
sum(antal * B_fett) / (A_fett + 0.0),
sum( anta*B_vitamin ) / (A_vitamin + 0.0),
sum(antal * B_kolhydrater)/(A_kolhydrater + 0.0),
sum( antal * B_jarn )/(A_jarn + 0.0),
from personer p,frukter f,kalender k
where p.id = k.namn_id
and k.frukt_id = frukter.id
group by name,datum
Jesper TMedlem sedan nov. 20017 144 inlägg Tack det ser ju enkelt ut. Är det de mest effektivaste sättet? Skall man göra relationer också, och hur skall de se ut?
LarsGMedlem sedan dec. 200012 464 inlägg Relationer (eller foreign keys) är alltid bra att ha. Du kan defienera dom med hjälp av SQL eller så brukar det finnas grafiskt stöd beroende på DBMS.
Effektivt, tja hur mycket data är det i tabellerna?
Jesper TMedlem sedan nov. 20017 144 inlägg
Effektivt, tja hur mycket data är det i tabellerna?
Ja, i Personer kanske det kommer att byggas ut med ett par tusen, i frukter ca 1500 och i kalendern så kan jag tänka mig att det blir ca tio poster per dag och person. Med enkel mattematik så borde "kalender" då innehålla
ca 7 300 000 poster/år Många poster blir det....
Data är dock ej så mycket, efersom att jag endast lagrar id, datum samt namn_id och frukt_id.
LarsGMedlem sedan dec. 200012 464 inlägg Då bör du indexera de kolumner som används vid join. Det är lite olika i olika DBMS. I de flesta så innebär en foreign key att man också skapar index på de kolumnerna.
Jesper TMedlem sedan nov. 20017 144 inlägg Jag har både Access och Ms Sql. Hur indexerar man?
LarsGMedlem sedan dec. 200012 464 inlägg create index indexName on tableName(columnName,...)
är syntaxen.
Kolumner som ingår i primärnyckeln är redan indexerade.
Jesper TMedlem sedan nov. 20017 144 inlägg
select namn,
sum(antal * B_fett) ,
sum( anta*B_vitamin ),
sum(antal * B_kolhydrater),
sum( antal * B_jarn ),
sum(antal * B_fett) / (A_fett + 0.0),
sum( anta*B_vitamin ) / (A_vitamin + 0.0),
sum(antal * B_kolhydrater)/(A_kolhydrater + 0.0),
sum( antal * B_jarn )/(A_jarn + 0.0),
from personer p,frukter f,kalender k
where p.id = k.namn_id
and k.frukt_id = frukter.id
group by name,datum
Jag förstår att detta är för att lista "ospecade" personer.
Detta är möjligen lite off topic, men i ASP nu då:
Låt säga att jag har en querystring med Personens id samt datum och vill lista denna persons unika dags fruktintag. Hur gör man då?
ex. ..where "& request("id") &" = k.namn_id... osv
Hur skriver man ut de summerade värdena? (Skall jag skapa recordsets?)
ex. Response.write rs sum( anta*B_vitamin ) / (A_vitamin + 0.0)
Hur gör man detta på bästa sätt?
LarsGMedlem sedan dec. 200012 464 inlägg Jo, just så.
sql = "..."
set rs = connect.execute(sql)
if not rs.eof then
'rs(0) innehåller namn
'rs(1) innehåller B_fett osv
end
Jesper TMedlem sedan nov. 20017 144 inlägg Tack, och min första fråga(För att bara hämta tex olle den 4:de okt)?Se föregående inlägg
LarsGMedlem sedan dec. 200012 464 inlägg Jaså, det trodde jag var klart. (Det var det jag menade med just så.)
select namn,
sum(antal * B_fett) ,
sum( anta*B_vitamin ),
sum(antal * B_kolhydrater),
sum( antal * B_jarn ),
sum(antal * B_fett) / (A_fett + 0.0),
sum( anta*B_vitamin ) / (A_vitamin + 0.0),
sum(antal * B_kolhydrater)/(A_kolhydrater + 0.0),
sum( antal * B_jarn )/(A_jarn + 0.0),
datum
from personer p,frukter f,kalender k
where p.id = k.namn_id
and k.frukt_id = frukter.id
and name = 'Olle'
and datum = #2002-10-04#
group by name,datum
Group by måste vara kvar.
Jesper TMedlem sedan nov. 20017 144 inlägg Nu blir det lite fel här:
Microsoft JET Database Engine error '80040e21'
You tried to execute a query that does not include the specified expression 'sum(antal*B_fett)/(A_fett+0)' as part of an aggregate function.
/frukt.asp, line 40
Där line 40 förståss är: set rs = connect.execute(sql)
LarsGMedlem sedan dec. 200012 464 inlägg sa fel
select namn,
sum(antal * B_fett) ,
sum( anta*B_vitamin ),
sum(antal * B_kolhydrater),
sum( antal * B_jarn ),
sum(antal * B_fett) / (avg(A_fett) + 0.0),
sum( anta*B_vitamin ) / (avg(A_vitamin) + 0.0),
sum(antal * B_kolhydrater)/(avg(A_kolhydrater) + 0.0),
sum( antal * B_jarn )/(avg(A_jarn) + 0.0),
datum
from personer p,frukter f,kalender k
where p.id = k.namn_id
and k.frukt_id = frukter.id
and name = 'Olle'
and datum = #2002-10-04#
group by name,datum
Jesper TMedlem sedan nov. 20017 144 inlägg Nu ser allt ut så här:
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.MapPath("frukt.mdb")
strSQL = "select namn,"&_
"sum(antal * B_fett) ,"&_
"sum(antal * B_vitamin),"&_
"sum(antal * B_kolhydrater),"&_
"sum(antal * B_jarn),"&_
"sum(antal * B_fett) / (avg(A_fett) + 0.0),"&_
"sum(antal * B_vitamin) / (avg(A_vitamin) + 0.0),"&_
"sum(antal * B_kolhydrater)/(avg(A_kolhydrater) + 0.0),"&_
"sum(antal * B_jarn)/(avg(A_jarn) + 0.0),"&_
"datum "&_
"from personer p,frukter f,kalender k "&_
"where p.id = k.namn_id "&_
" and k.frukt_id = frukter.id"&_
" and namn = 'Olle'"&_
" and datum = #2002-10-27# "&_
" group by namn,datum"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConnString
Set objRS = objConn.Execute(strSQL)
set rs = connect.execute(sql)
if not rs.eof then
Response.write rs(0)&" "& rs(1)&"<br>" 'innehåller B_fett osv
End If
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
Men får felkod:
No value given for one or more required parameters.
/frukt.asp, line 35
---->Set objRS = objConn.Execute(strSQL)
LarsGMedlem sedan dec. 200012 464 inlägg Det är något kolumnnamn som är felstavat. T.ex name istf namn i group by.
Om man får något fel som detta så är det enklast att hitta det genom att testa frågan direkt i Access.
Jesper TMedlem sedan nov. 20017 144 inlägg Jag ändrade denna rad: " and k.Frukt_id = Frukter.id"
Till :
"and k.Frukt_id = f.id"
Funkar finfint nu! :)
AVG=beräknar genomsnittligt värde (för numeriska kolumner)
Jesper TMedlem sedan nov. 20017 144 inlägg Ok, nu har jag en massa siffror, men...
Om jag också vill loopa fram vilken/vilka frukter olle har ätit vid ett specifikt datum och inte bara summan av kardemumman.
Ex.
Datum 02-10-27 Namn: Olle
Frukt-stund på fröets förskola
-----------------------------------------
Banan 12g fett Antal: 2
Blåbär 16g fett Antal: 4
------------------------------------------
Totalt: Fett 45g | Kolhydrater: 541 osv
När jag försöker att lägga till något ex.Frukt så står det:
You tried to execute a query that does not include the specified expression 'Frukt' as part of an aggregate function.
Måste jag skapa flera sql-satser?
LarsGMedlem sedan dec. 200012 464 inlägg I så fall så får du hämta alla värden och utföra slutsummeringen i ASP
strSQL = "select namn,frukt,antal,"&_
"B_fett , B_vitamin"&_
"B_kolhydrater, B_jarn"&_
"from personer p,frukter f,kalender k "&_
"where p.id = k.namn_id "&_
" and k.frukt_id = frukter.id"&_
" and namn = 'Olle'"&_
" and datum = #2002-10-27# "
set rs = connect.execute(sql)
sumFett = 0
sumVitamin = 0
sumKolhydrat = 0
sumJarn = 0
while not rs.eof
'visa data
'summera
rs.movenext
wend
'visa totalsumma
Jag tittade lite mer på din datamodell. Egentligen så borde du lagra beståndsdelarna (eller vad man nu skall kalla det) i en egen tabell och så skulle du ha en många-många relation mellan frukt och beståndsdelar.
Delar
id name
---------
1 Fett
2 Järn
FruktDelar
FruktID delid gram
-----------------------
1 1 15
Det är samma sak för personer att dom har en många till många relation till beståndsdelar.
Det är förmodligen inte relevant att lagra varje person man kan definera ett antal grupper (beroende på vikt/ålder/kön?)
gruppid delid gram
------------------------
1 1 46
och då behövs en grupptillhörighet i persontabellen.
Med den här modellen är det mycket enklare att lägga till nya delar som ni är intresserade av. Med din nuvarande tabellstruktur så måste man du lägga till nya kolumner och skriva om frågorna.
(Lite sent påtänkt.)