Jag har en databas där jag söker fram antal planerade leveranser per månad, och sedan presenterar dem i en tabell. Sql-frågan ser ut så här (jag har fler villkor, men för enkelhets skull så utelämnar jag dem här): Hej! Sorry, jag visste väl att det var nåt jag glömde.... Access 2003. Hur blir det då? Det var värre, har ingen koll på hur det skrivs i Access 2003 Slog lite i hjälpen för Access 2003, och hittade det här: Hmm. Vad är "Nz" i det här fallet? Använder jag ovanstående rakt av får jag: Jaaaa du, det var värre. <b>Jag har en databas där jag söker fram antal planerade leveranser per månad, och sedan presenterar dem i en tabell.</b> Kunde inte låta bli att grotta lite till i detta, och se hur man kan göra i Access 2003. <b>Andreas:</b> Du som kan det här med Access 2003. Andreas och Håkan: Båda era förslag funkar fint (fast Andreas' med arrayer etc gick lite ovanför mitt huvud - jag ska kolla noggrannare på det i morgon, för det verkar effektivare). Tack så hemskt mycket!! Nz i Access är motsvarande ISNULL i SQL-server eller IFNULL i MySql. Det är väl effektivare att skriva: @Andreas. Om man har AVG() funktionen så skulle jag kunna se att det ställer till det. Jag hade litet bråttom att komma med "mothugg" i den tråden. Det stämmer nog att det inte kan bli problem vid SUM(), men i andra fall kan det bli det. Det blir skillnad om det inte finns några poster som uppfyller villkoret. Tack för att du förtudliga detta.Hur gör man när Sql Sum blir Null?
<code>
SqlLevJan = "SELECT SUM(antal) FROM levplan WHERE manad = 1 "
Set LevJan = Connect.Execute(SqlLevJan)
.... övrig kod....
<%=LevJan(0)%>
</code>
"Antal" i databasen har oftast värdet 1, men kan ha andra värden också, det är därför jag summerar antalen i stället för att bara räkna posterna. Jag adderar också "LevJan" med andra frågor mot databasen längre ner i tabellen.
Detta fungerar på det stora hela bra, men jag får problem när det inte finns några databasposter som matchar frågorna - det blir väl ett null-värde som inte går att skriva ut som "0", och inte heller addera med andra frågor. I övrigt går det att köra hela sidan utan felmeddelande i browsern.
Jag har experimenterat med olika kombinationer av isnull, coalesce och case, men får inte fram något resultat i alla fall. Jag vill presentera en fråga utan databasträffar som "0", och kunna addera den med andra värden. Vet inte om det ska gå att få fram det resultat jag är ute efter på det här sättet, om jag använde fel syntax eller om det är något annat som spökar. Kan någon hjälpa mig? Är det lämpligt att använda isnull, coalesce (tror inte det, eftersom resultatet i sig blir null?), case eller något annat? Och hur ser korrekt syntax ut? Jag har surfat runt ett par timmar och letat idag men inte blivit klokare för det...
Tackar på förhand!
/mSv: Hur gör man när Sql Sum blir Null?
En lösning för SQL Server.SELECT ISNULL(SUM(ISNULL(antal, 0)), 0) FROM levplan WHERE (manad = 1)
Beror ju på vilken DB du använder.
//Håkan
Sv:Hur gör man när Sql Sum blir Null?
/m
Sv: Hur gör man när Sql Sum blir Null?
//Håkan Sv: Hur gör man när Sql Sum blir Null?
<b>Nz(Sum(Nz([antal], 0)), 0)</b>
Testa.
//Håkan Sv:Hur gör man när Sql Sum blir Null?
Microsoft JET Database Engine error '80040e14'
Undefined function 'Nz' in expression.
???
/mSv: Hur gör man när Sql Sum blir Null?
Hittade det i hjälpen för Access 2003, så Access borde veta vad det är för något.
//HåkanSv: Hur gör man när Sql Sum blir Null?
Vill du loopa ut samtliga månader så är det effektivare att göra med en fråga:
Dim rs
Dim con
Dim M
Dim Lev(12)
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=" & Server.MapPath("db.mdb") & ";" + _
"Mode=Share Deny None;"
Set rs = CreateObject("ADODB.Recordset")
rs.Open "SELECT manad, SUM(antal) AS tot_antal" + vbCrLf + _
"FROM levplan" + vbCrLf + _
"GROUP BY manad", con
Do Until rs.EOF
Lev(rs("manad").Value) = rs("tot_antal").Value
rs.MoveNext
Loop
rs.Close
con.Close
%>
.... övrig kod....
<table>
<tr>
<th>January</th>
<th>February</th>
<th>March</th>
...
<th>November</th>
<th>December</th>
</tr>
<tr>
<td><%=CLng(Lev(1))%></td>
<td><%=CLng(Lev(2))%></td>
<td><%=CLng(Lev(3))%></td>
...
<td><%=CLng(Lev(11))%></td>
<td><%=CLng(Lev(12))%></td>
</tr>
</table>
Genom att då lagra bara de månader som finns i arrayen så kan du få de tomma värdena till 0 genom att använda CLng(). Detta fungerar bara på tomma variabler/arrayer inte på null värden från databas.
Sv: Hur gör man när Sql Sum blir Null?
Fick den här koden att göra samma som koden för SQL Server.
<code>SELECT IIf( ISNULL(SUM(antal)), 0, SUM(antal)) FROM levplan WHERE manad = 1</code>
//HåkanSv:Hur gör man när Sql Sum blir Null?
Vad är <b>Nz</b> som dom skriver om i hjälpen för Access 2003?
Vaför får inte Marie det att fungera?
(Nyfiken).
//HåkanSv: Hur gör man när Sql Sum blir Null?
/mSv: Hur gör man när Sql Sum blir Null?
x = Nz(Uttryck, Värde om uttryck är NULL)
Du bör kunna skriva så här,
SqlLevJan = "SELECT SUM(Nz(antal, 0)) AS tot_antal FROM levplan WHERE manad = 1 "Sv:Hur gör man när Sql Sum blir Null?
SqlLevJan = "SELECT Nz(SUM(antal), 0) AS tot_antal FROM levplan WHERE manad = 1 "
Anropa funktinoen En gång istället för varje post.
Då null påverkar inte summan kan man göra på detta sättet.
Sv: Hur gör man när Sql Sum blir Null?
Håller med dig, jag skrev på ditt sätt som svar på en annan fråga och fick där mothugg och påståendet att det kan bli problem i vissa fall, jag har dock inte fått någon förklaring till vilka problem det kan bli.Sv:Hur gör man när Sql Sum blir Null?
Men inte för sum.Sv:Hur gör man när Sql Sum blir Null?
Sv: Hur gör man när Sql Sum blir Null?
<code>
select sum(nz(c,0)) from where false
</code>
returnerar null
<code>
select nz(sum(c),0) from where false
</code>
returnerar 0
Om man har group by med, som i den andra tråden, så har det ingen betydelse.Sv:Hur gör man när Sql Sum blir Null?
Jag ser däremot ingen vinst i att använda:
<code>
SELECT SUM(nz(antal,0)) FROM levplan WHERE manad = 1
</code>
Eftersom resultatet är detsamma som :
<code>
SELECT SUM(antal) FROM levplan WHERE manad = 1
</code>
Det finns ingen vinst i denna fråga.
Däremot finns det en stor förlust då resultatet innehåller poster, då dyrt och onödigt för detta resultatet funktionsanrop utförs för samtliga poster.