---
title: "Plocka värden"
type: "forum-thread"
url: "https://www.webforum.nu/amne/databaser-sql/98534-plocka-värden"
topic: "Databaser & SQL"
topic_url: "https://www.webforum.nu/amne/databaser-sql"
author: "AG"
published: "2004-03-01T17:14:10.000Z"
updated: "2004-07-20T17:52:35.000Z"
replies: 15
views: 465
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/98534-plocka-värden"
---

# Plocka värden

## #1 — AG, 2004-03-01T17:14Z

Jag har en databas som innehåller tabeller med valutavärden, dag för dag. Dock hämtas ej data på helgdagar och vissa andra dagar.
Tabell euro_tbl
id
name (Ex USD, EUR, SEK)
value -double (Ex. 2.72)
date (Ex. 2004-01-22)

Tabell name_tbl
id
name (Svensk Krona)
prfx (SEK)

Nu skulle jag vilja göra en sqlsats som listar de senaste värdena
jämför med de från mätningen innan (observera att senaste mätning innan kan vara 1,2,3,4 dagar tillbaka). Den skall också hämta "name" från name_tbl genom att jämföra "prfx" mot "name"

Alltså listningen skall bli något istil med:

```
EMU Euro	EUR	9.25	0.03
USA Dollar	USD	7.39	-0.04
Dansk Krone	DKK	1.20	0.02
...
```

tack
Andreas

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

## #2 — LarsG, 2004-03-01T18:08Z

Ja, den typen av frågor blir ju väldigt lättbegripliga och intuitiva med Mysql ...

```
select n.name, n.prfx, e1.val, e1.val - e3.val
 from name_tbl n join euro_tbl e1
   on n.prfx = e1.name
 join euro_tbl e2
   on e1.name = e2.name
 join euro_tbl e3
   on e2.name = e3.name
  and e3.vdat < e2.vdat
 join euro_tbl e4
   on e3.name = e4.name
  and e4.vdat < e2.vdat
group by n.name, n.prfx, e1.val,e1.vdat, e3.val, e3.vdat
having max(e2.vdat) = e1.vdat
and max(e4.vdat) = e3.vdat
```

Flyttas från Mysql.

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

## #3 — Engine^, 2004-03-02T01:51Z

**LarsG**: Kommer man verkligen undan med det utan att ha med *e1.val - e3.val* eller 3 i GROUP BY? Räcker det att ha med *e1.val* och *e3.val* i grupperingen?

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

## #4 — LarsG, 2004-03-02T21:06Z

> Kommer man verkligen undan med det utan att ha med e1.val - e3.val

Jo

> eller 3

Var har du lärt dig sådana olater?

Enligt standard så får det bara vara kolumner i group by.

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

## #5 — AG, 2004-03-02T22:12Z

Får det tyvärr ej fungera,, när jag skriver in det i mysqlfront får jag felet "Unknown column 'e1.vdat' in 'having clause'"

Andreas

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

## #6 — LarsG, 2004-03-03T08:40Z

Byt vdat mot namnet på den kolumn som inehåller datum.

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

## #7 — AG, 2004-03-03T13:00Z

Det är det som är det konstiga, det hade jag gjort.
Fältet heter vdat och är ett varchar fält.

Andreas

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

## #8 — LarsG, 2004-03-03T16:13Z

Då förstår jag inte. (Jag hittade på vdat eftersom date är ett reserverat ord i SQL och därmed inte inte är tillåtet som kolumnnamn.)

I och för sig så skall du byta datatyp från varchar till date men det är ju en annan sak.

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

## #9 — AG, 2004-03-03T18:25Z

Skum, såhär skriver MYSQL-front ut den:

```
select n.name, n.prfx, e1.value, e1.value - e3.value
 from name_tbl n join ecb_tbl e1
   on n.prfx = e1.name
 join ecb_tbl e2
   on e1.name = e2.name
 join ecb_tbl e3 
   on e2.name = e3.name
  and e3.vdat < e2.vdat
 join ecb_tbl e4
   on e3.name = e4.name
  and e4.vdat < e2.vdat
group by n.name, n.prfx, e1.value, e1.vdat, e3.value, e3.vdat
having max(e2.vdat) = e1.vdat and max(e4.vdat) = e3.vdat
```

Tabellerna ser ut på följande sätt:

```
Tabell finance

ecb_tbl
Id (tinyint(6))
name (char(3))
value (double)
vdat (date)

name_tbl
Id (tinyint)
name(varchar(55))
prfx(char(3))
```

tack
Andreas

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

## #10 — LarsG, 2004-03-03T19:16Z

Som sagt så förstår jag inte vad som är felet. Jag har skapat tabellerna och testat frågan (i en annan DBMS än Mysql) utan att få något fel.

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

## #11 — Engine^, 2004-03-03T19:26Z

Då återstår det väl några små saker att testa.

Felstavningar?

Bryt ner frågan i mindre delar.

```
select n.name, n.prfx, e1.value, e1.value - e2.value
 from name_tbl n
 join ecb_tbl e1
   on n.prfx = e1.name
 join ecb_tbl e2
   on e1.name = e2.name
group by n.name, n.prfx, e1.value, e1.vdat, e2.vdat
having max(e2.vdat) = e1.vdat
```

Klarar din version av MySQL av någon anledning inte av en HAVING-klausul med tabellalias?

Är det ogiltiga data i någon av kolumnerna?

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

## #12 — AG, 2004-03-27T18:36Z

Funderar på detta, kan det vara så att MySQL-front inte har stöd för having?

Andreas

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

## #13 — AG, 2004-03-28T17:17Z

Testade att köra ut den i en jsp-böna, får samma fel:

```
sql : com.mysql.jdbc.PreparedStatement@eb7331: select n.name, n.prfx, e1.value, e1.value - e2.value from name_tbl n join ecb_tbl e1 on n.prfx = e1.name join ecb_tbl e2 on e1.name = e2.name group by n.name, n.prfx, e1.value, e1.vdat, e2.vdat having max(e2.vdat) = e1.vdat
```

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

## #14 — AG, 2004-03-29T16:14Z

Har sparat ner databasen för test:
<http://www.digital-network.nu/finance.sql>

Andreas

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

## #15 — AG, 2004-07-16T13:39Z

Fick sql-satsen att fungera i några månader, sedan blev jag kontaktad av webbhotellet som menade att denna uträkning tog för mycket resurser.
Fick ett svar någonstans att det var Having-delen som drog ner databasen i träsket.

Tänkte då att det skull räcka ifall man bara kontrollerade value på 'vdat' och 'vdat-1', finns ej 'vdat-1' så skrivs inget ut.

Någon som har en tanke, idé på hur man skulle ställa upp denna sql-sats, med mål att göra den så prestandaeffektiv som möjligt.

```
select 
   n.name, 
   n.prfx, 
   e1.value, 
   e1.value - e3.value,
   e1.vdat,
   e3.vdat
from 
   name_tbl n 
       join ecb_tbl e1 on n.prfx = e1.name
       join ecb_tbl e2 on e1.name = e2.name
       join ecb_tbl e3 on e2.name = e3.name and e3.vdat < e2.vdat
       join ecb_tbl e4 on e3.name = e4.name and e4.vdat < e2.vdat
group by 
   n.name, 
   n.prfx, 
   e1.value, 
   e1.vdat,
   e3.value, 
   e3.vdat
having 
   max(e2.vdat) = e1.vdat and 
   max(e4.vdat) = e3.vdat
```

tack
Andreas

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

## #16 — AG, 2004-07-20T17:52Z

Ingen reaktion på lösning än, så jag funderar.

Man skulle kunna lösa det på själva presentationsdelen, dvs i mitt fall i en Javaböna, att man plockar data från två separata sqlsatser typ, select top 1 \* from ecb_tbl order by...' resp select top 2 ' from ecb_tbl order by...' men detta känns inte som en snygg lösning. Skulle gärna vilja lösa det med en sql-fråga.

Andreas

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

---

Tråden på webben: https://www.webforum.nu/amne/databaser-sql/98534-plocka-värden
