AGMedlem sedan mars 20001 266 inlägg 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
LarsGMedlem sedan dec. 200012 464 inlägg 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.
Engine^Medlem sedan dec. 20003 887 inlägg 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?
LarsGMedlem sedan dec. 200012 464 inlägg
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.
AGMedlem sedan mars 20001 266 inlägg 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
LarsGMedlem sedan dec. 200012 464 inlägg Byt vdat mot namnet på den kolumn som inehåller datum.
AGMedlem sedan mars 20001 266 inlägg Det är det som är det konstiga, det hade jag gjort.
Fältet heter vdat och är ett varchar fält.
Andreas
LarsGMedlem sedan dec. 200012 464 inlägg 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.
AGMedlem sedan mars 20001 266 inlägg 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
LarsGMedlem sedan dec. 200012 464 inlägg 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.
Engine^Medlem sedan dec. 20003 887 inlägg 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?
AGMedlem sedan mars 20001 266 inlägg Funderar på detta, kan det vara så att MySQL-front inte har stöd för having?
Andreas
AGMedlem sedan mars 20001 266 inlägg 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
AGMedlem sedan mars 20001 266 inlägg Har sparat ner databasen för test:
http://www.digital-network.nu/finance.sql
Andreas
AGMedlem sedan mars 20001 266 inlägg 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
AGMedlem sedan mars 20001 266 inlägg 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