Hej! Använd SUM och GROUP BY Exakt hur skiljer sig det från det jag skrev? Du kan ju testa:Problem med NULL-värden
Jag sliter med en SELECT-sats i Access 2003 som summerar en kolumn med tal, men jag vill att vissa av posterna skall subtraheras från summan. Exempel:
Tabellen:
----------------------------------
Nyckel Param1 Värde
----------------------------------
1 a 24
2 b 35
3 b 18
Önskat resultat med select-satsen:
----------------------------------------------
Param1 Term1 Term2 Diff
----------------------------------------------
a 24 NULL 24
b 35 18 17
Jag har nu följande sql-sats:
SELECT Param1,
(SELECT SUM(Värde) FROM Siffertest AS s2 WHERE s1.Param1 = s2.Param1 AND NOT Nyckel = 3) AS Term1,
(SELECT SUM(Värde) FROM Siffertest AS s2 WHERE s1.Param1 = s2.Param1 AND Nyckel = 3) AS Term2,
(SELECT SUM(Värde) FROM Siffertest AS s2 WHERE s1.Param1 = s2.Param1 AND NOT Nyckel = 3) -
(SELECT SUM(Värde) FROM Siffertest AS s2 WHERE s1.Param1 = s2.Param1 AND Nyckel = 3) AS Diff
FROM Siffertest AS s1
GROUP BY Param1
Resultatet av detta är att de subqueries som inte hittar några poster att summera returnerar NULL, vilket gör att differensen också blir NULL. Det vill säga, för den post där Param1 = 'a' blir differensen (24 - NULL = NULL). Jag vill att de posterna skall behålla sitt originalvärde istället, alltså (24 - 0 = 24).
Hur kan jag göra det?
Några tips?
MVH
Johannes Jonsson
Sv: Problem med NULL-värden
alltså:
select param1, sum([värde])
from tabellen
group by param1;
Å en annan sak, ändra column-namnen, ä i tabellen är inte så bra...
/MSv:Problem med NULL-värden
Jag lyckades iallafall lösa detta med UNION. Dessvärre går inte UNION att använda i subqueries, så jag fick skapa en vy (eller fråga heter det väl i access) enligt följande:
SELECT Param1, SUM(Värde) AS Summa
FROM Siffertest
WHERE NOT Nyckel = 3
GROUP BY Param1
UNION
SELECT Param1, -SUM(Värde) AS Summa
FROM Siffertest
WHERE Nyckel = 3
GROUP BY Param1;
vilket gav följande resultattabell:
Param1 Summa
a 24
b -18
b 35
och då kunde jag köra ytterligare en fråga på den vyn, som helt enkelt summerade efter Param1 vilket gav resultatet:
Param1 Summa
a 24
b 17
Vilket var vad jag var ute efter. Dock känns lösningen lite otymplig, så om nån har nån mer koncis lösning är den välkommen!
Angående namnet 'värde' så var det rent illustrativt för exemplet, jag använder inte icke-engelska tecken på kolumner m m normalt, även om access ju tyvärr tillåter det...
/JohannesSv: Problem med NULL-värden
<code>
SELECT Param1, SUM(Värde * (Nyckel = 3)) AS Summa
FROM Siffertest
WHERE Nyckel = 3
GROUP BY Param1;
</code>
Uttrycket (Nyckel = 3) ger ju värdet 0 om den är falsk och -1 om den är san.