---
title: "Fruktlista?"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/57166-fruktlista"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "Jesper T"
published: "2002-10-26T13:50:41.000Z"
updated: "2002-10-27T23:01:07.000Z"
replies: 19
views: 659
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/databaser-sql/57166-fruktlista"
---

# Fruktlista?

## #1 — Jesper T, 2002-10-26T13:50Z

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.

Permalänk: https://www.webforum.nu/p/57166

## #2 — LarsG, 2002-10-26T14:54Z

```
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
```

Permalänk: https://www.webforum.nu/p/835456

## #3 — Jesper T, 2002-10-26T15:46Z

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?

Permalänk: https://www.webforum.nu/p/835490

## #4 — LarsG, 2002-10-26T16:03Z

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?

Permalänk: https://www.webforum.nu/p/835507

## #5 — Jesper T, 2002-10-26T18:13Z

> 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.

Permalänk: https://www.webforum.nu/p/835597

## #6 — LarsG, 2002-10-26T18:20Z

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.

Permalänk: https://www.webforum.nu/p/835599

## #7 — Jesper T, 2002-10-26T18:32Z

Jag har både Access och Ms Sql. Hur indexerar man?

Permalänk: https://www.webforum.nu/p/835606

## #8 — LarsG, 2002-10-26T18:35Z

```
create index indexName on tableName(columnName,...)
```

är syntaxen.

Kolumner som ingår i primärnyckeln är redan indexerade.

Permalänk: https://www.webforum.nu/p/835612

## #9 — Jesper T, 2002-10-27T17:25Z

> ```
> 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?

Permalänk: https://www.webforum.nu/p/836032

## #10 — LarsG, 2002-10-27T17:51Z

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
```

Permalänk: https://www.webforum.nu/p/836047

## #11 — Jesper T, 2002-10-27T18:01Z

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

Permalänk: https://www.webforum.nu/p/836062

## #12 — LarsG, 2002-10-27T18:12Z

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.

Permalänk: https://www.webforum.nu/p/836070

## #13 — Jesper T, 2002-10-27T18:35Z

Tack kära du!

Permalänk: https://www.webforum.nu/p/836087

## #14 — Jesper T, 2002-10-27T20:19Z

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)

Permalänk: https://www.webforum.nu/p/836146

## #15 — LarsG, 2002-10-27T20:25Z

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
```

Permalänk: https://www.webforum.nu/p/836149

## #16 — Jesper T, 2002-10-27T20:37Z

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)

Permalänk: https://www.webforum.nu/p/836157

## #17 — LarsG, 2002-10-27T20:52Z

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.

Permalänk: https://www.webforum.nu/p/836163

## #18 — Jesper T, 2002-10-27T21:04Z

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)

Permalänk: https://www.webforum.nu/p/836168

## #19 — Jesper T, 2002-10-27T22:06Z

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?

Permalänk: https://www.webforum.nu/p/836191

## #20 — LarsG, 2002-10-27T23:01Z

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.)

Permalänk: https://www.webforum.nu/p/836217

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/57166-fruktlista
