Inlägget är på engelska... försökte i ett annat forum men ingen kunde lista ut det... jag tror alla här är minst lika kompetenta som mig på engelska så... Eftersom du enbart filtrerar datum ur kbudget känns det som att urtvalet helt plötsligt matchar fler poster (två istället för en), då blir det så... Testa att gruppera på b.belopp också, då gissar jag att du kommer se vad som är galet... Aha... jag behövde göra SUM() även på budgetbeloppet, nu fattar jag =) tack. Hade förbisett det eftersom det vanligtvis, när man bara har en månad, bara finns en post för budget =) Hmm... skumt.. det där löste visst ändå inte problemet... om det inte spänner över mer än 4 månader så går allt som det skall, men om man går över 5 månader så blir det dubbelräknat... Ibland trippelräknat till och med... svårt att hitta när det händer under vissa omständigheter men funkar ibland... Är du säker på att du inte har fler matchningar i kbudget? Beskriv gärna vilka indata du har när du får fel resultat. Om jag till exempel har startdate 2007-01-01 och stopdate 2007-10-31 så blir det typ 5 kopior av varje rad... om det finns fler poster i tabellen budget borde väl inte göra någon skillnad när jag använder en SUM() för beloppet jag hämtar ur budget, eller..? Om du får upp resultatet 5 ggr så innebär det att summan blir 5 ggr så stor... Börja med att ta bort summering och gruppering. Se sedan till att du inte får dubletter av något, då borde det bli rätt sedan. Okej, nu ser jag vad den gör, men inte hur jag skall lösa det. När jag tog bort summeringarna så såg jag att varje transaktion i kassaboken ju faktiskt dyker upp en väldig massa fler gånger än jag ville... Förekommer det "dublettrader" i någon tabell? Här kommer frågan, föld av exempeldata... har här tagit bort sum() för att kunna se vad som verkligen hämtas ur databsen... Testa det här: Hurra hurra, funkar! =) Kul att det fungerade! Hej, Kan bero på att det blir ett NULL resultat från SELECTen som hämtar ut budget. Jo, men det har det ju alltid blivit förut också, eftersom det kommer att finnas kategorier som inte har någon budget för en given månad, men det finns ändå transaktioner. Eller tvärt om, i början av månaden finns bara en budget, inga transaktioner, då blir det ju null.MySQL gives double values
I am back with a tricky problem... I am trying to read out monetary values from a table and I give the user the option to choose freely what dates to generate the report from.
It works fine as long as the dates doesn't span over more than one month, but if I take a report from let's say 1st of september to last of october, I get double values out, i.e. SUM(kassa.belopp) gives me double of what is actually in the table, and that really confuses me...
any input is appreciated...
...
SELECT SUM(kassa.belopp) summa, kat.kategori namn, kat.id id, kat.inkomst inkomst, kat.fast fast, b.belopp budget FROM `kategorier` kat LEFT OUTER JOIN `kkassabok` kassa ON (kat.id = kassa.kategori AND kassa.datum BETWEEN ? AND ?) LEFT OUTER JOIN `kbudget` b ON (kat.id = b.kategori AND b.datum BETWEEN ? AND ?) WHERE kat.user = ? GROUP BY kat.id ORDER BY inkomst DESC"
...
set rs = cmd.execute (,array(startdate,enddate,startdate,enddate,session("user")))Sv: MySQL gives double values
/JohanSv:MySQL gives double values
Sv: MySQL gives double values
Sv:MySQL gives double values
/JohanSv: MySQL gives double values
Sv:MySQL gives double values
/JohanSv: MySQL gives double values
Med min join ville jag utgå från tabellen kategorier, och för varje kategori vill jag summera allt i tabellen kassabok med just den kategorin, med en till join vill jag sedan summera allt i tabellen budget för den kategorin (du ser lätt vad jag är ute efter att göra, typ som bokföring).
Vad som händer när det finns flera rader i tabellen budget är att för varje rad i budget så plockas en till kopia av varje transaktion med från kassaboken.
Så, det måste vara fel på sättet jag skrivit min join? Eller är det mina kriterier som är klantiga?
(Delar den för tydlighetens skull...)
SELECT SUM(kassa.belopp) summa, kat.kategori namn, kat.id id, kat.inkomst inkomst, kat.fast fast, SUM(b.belopp) budget FROM `kategorier` kat
LEFT OUTER JOIN `kkassabok` kassa ON (kat.id = kassa.kategori)
LEFT OUTER JOIN `kbudget` b ON (kat.id = b.kategori)
WHERE kat.user = ? AND kassa.datum BETWEEN ? AND ? AND b.datum BETWEEN ? AND ?
GROUP BY kat.id ORDER BY inkomst DESC,fast DESC,namn
Frågetecknen består alltså av datum när jag väl kör det hela i command-objektet, ex. BETWEEN 2007-01-01 AND 2007-08-31Sv:MySQL gives double values
Kan du ge exempel på ett par rader från båda tabellerna?
/HåkanSv: MySQL gives double values
SELECT kassa.belopp summa , kassa.datum kassaboksdatum , kassa.lopnr lopnr ,
b.datum budgetdatum , kassa.text , kat.kategori namn , kat.id id , kat.inkomst inkomst , kat.fast fast ,b.belopp budget FROM `kategorier` kat LEFT OUTER JOIN `kkassabok` kassa ON ( kat.id =
kassa.kategori ) LEFT OUTER JOIN `kbudget` b ON ( kat.id = b.kategori ) WHERE kat.user = 1
AND kassa.datum BETWEEN '2007-01-01' AND '2007-12-31' AND b.datum BETWEEN
'2007-01-01' AND '2007-12-31' ORDER BY inkomst DESC , fast DESC , namn LIMIT 0, 30 ;
summa kassaboksdatum lopnr budgetdatum text namn id inkomst fast budget
13651.62 2007-01-01 890 2007-01-01 M lön Lön 1370 1 0 13651
15717.56 2007-02-01 952 2007-01-01 M Lön 1370 1 0 13651
3599.40 2007-02-01 953 2007-01-01 S Lön 1370 1 0 13651
16713.56 2007-03-01 1020 2007-01-01 M feb Lön 1370 1 0 13651
3746.50 2007-03-01 1034 2007-01-01 S Lön 1370 1 0 13651
16873.24 2007-04-01 1105 2007-01-01 Lön 1370 1 0 13651
-------
13651.62 2007-01-01 890 2007-02-01 M lön Lön 1370 1 0 19317
15717.56 2007-02-01 952 2007-02-01 M Lön 1370 1 0 19317
3599.40 2007-02-01 953 2007-02-01 S Lön 1370 1 0 19317
16713.56 2007-03-01 1020 2007-02-01 M feb Lön 1370 1 0 19317
3746.50 2007-03-01 1034 2007-02-01 S Lön 1370 1 0 19317
16873.24 2007-04-01 1105 2007-02-01 Lön 1370 1 0 19317
Problemet är alltså att för varje rad i tabellen kbudget så hämtas en ny uppsättning (kopia) av alla rader i tabellen kkassabok...Sv:MySQL gives double values
<code>
SELECT SUM(kassa.belopp) summa,
kat.kategori namn,
kat.id id,
kat.inkomst inkomst,
kat.fast fast,
SELECT SUM(belopp) FROM `kbudget` WHERE (kategori = kat.id) budget
FROM `kategorier` kat
LEFT OUTER JOIN `kkassabok` kassa ON (kat.id = kassa.kategori)
WHERE kat.user = ? AND kassa.datum BETWEEN ? AND ? AND b.datum BETWEEN ? AND ?
GROUP BY kat.id ORDER BY inkomst DESC, fast DESC,namn
</code>
/HåkanSv: MySQL gives double values
Fick lägga till parenteser runt
(SELECT SUM(belopp) FROM `kbudget` WHERE kategori = kat.id AND datum BETWEEN ? AND ?) budget
kanske är en MySQL specifik syntax.
Tack så oerhört mycket!!Sv:MySQL gives double values
Parenteserna var en miss från mig, och är inte MySQL specifik, gäller åtminstone MsSql Server också.
/HåkanSv: MySQL gives double values
en sak gör koden annorlunda nu, om det finns kategorier i tabellen kategorier som inte har något motsvarande innehåll i tabellen kassabok (alltså inga transaktioner registrerade i den valda tidsperioden för en viss kategori) så visas inte kategorin alls.
Tdigare visades alla kategorier, då med saldo 0 om det inte fanns några transaktioner i tabellen kassabok.
Jag trodde att den skulle uppföra sig lika dant nu eftersom det ju är en OUTER join, dvs. den ska ju ta allt från tabellen kategorier och det som matchar från tabellen kassabok...
Jag förstår inte riktigt varför den gör så.. =) Alla kommentarer uppskattas..
MattiasSv:MySQL gives double values
Sätt en ISNULL (eller vad det heter i MySql) runt SUM, och returnera 0
Kan även gälla summa som räknas ut först i frågan.
/HåkanSv: MySQL gives double values
Koden som skriver ut värdena tar hand om det genom att göra en
IF IsNull(rs("summa")) THEN var_belopp=0
Med outer join får man väl nästan alltid nullvärden.. men här är det som att det inte ens kommer med i min recordset när det finns en null i tabellen kassabok (inga transaktioner ännu)...