[vb6 en SQL] Problemen met where clause

Pagina: 1
Acties:
  • 219 views sinds 30-01-2008
  • Reageer

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Hallo,

Ik heb een probleempje. Ik wil namelijk een query uitvoeren die alleen die records laat zien die voldoen aan een aantal in de query berekende waarden.

Dit is de query:
SQL:
1
2
3
4
SELECT orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum, Sum(orders.Aantal) AS AantalInBehandeling, Sum(behandeld.Aantal) AS AantalBehandeld, (AantalInBehandeling-AantalBehandeld) AS AantalNuInBehandeling
FROM orders
LEFT  JOIN behandeld ON (orders.Productcode = behandeld.Productcode) AND (orders.Ordernummer = behandeld.Ordernummer) WHERE  AantalBehandeld < 1 OR (AantalBehandeld > 0 AND AantalNuInBehandeling > 0)
GROUP BY orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum;


Wanneer ik deze query in Access uitvoer vraagt hij om AantalBehandeld. Ik denk dus dat hij de variabelen die in de WHERE clause staan niet herkend worden terwijl ik ze daarboven bereken. Wanneer ik de variabelen vervang door een SUM functie zegt Access dat er geen bereken functies (zoals SUM) mogen worden gebruikt in een WHERE clause.

Vb zegt:
To few parameters: Expected 2.

Weet iemand wat dit inhoud en en kan die gene mij misschien ook een beetje de goede richting in sturen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Je mag idd geen SUM() of andere aggregated functies in je where clause gaan gebruiken.

Wat je kan doen:
eerst een query doen die die SUM() gaat gaan uitvoeren.
Dan die query die je nu gepost hebt, waar je de resultaten van je eerdere query als parameter aan meegeeft.

https://fgheysels.github.io/


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
whoami schreef op 15 december 2003 @ 13:39:
Je mag idd geen SUM() of andere aggregated functies in je where clause gaan gebruiken.

Wat je kan doen:
eerst een query doen die die SUM() gaat gaan uitvoeren.
Dan die query die je nu gepost hebt, waar je de resultaten van je eerdere query als parameter aan meegeeft.
Lijkt me een goede oplossing maar is het echt niet mogelijk om dit in één query te doen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Slagroom schreef op 15 december 2003 @ 13:43:
[...]

Lijkt me een goede oplossing maar is het echt niet mogelijk om dit in één query te doen?
Waarom wil je het in 1 query doen?
2 queries zijn soms efficienter dan 1 query, zeker als je daarmee kunt vermijden dat je functies in je where - clausule gaat gebruiken.

https://fgheysels.github.io/


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

misschien HAVING ipv WHERE?

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
pistole schreef op 15 december 2003 @ 13:45:
misschien HAVING ipv WHERE?
HAVING gebruik je als je wilt filteren op een aggregated functie, zoals bv:
geef alle records waarvoor de som van veld A > 10
code:
1
2
3
SELECT *, sum(veldA) as blaat
FROM tabel
HAVING blaat > 10

https://fgheysels.github.io/


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
whoami schreef op 15 december 2003 @ 13:44:
[...]


Waarom wil je het in 1 query doen?
2 queries zijn soms efficienter dan 1 query, zeker als je daarmee kunt vermijden dat je functies in je where - clausule gaat gebruiken.
Iedere record heeft een andere uitkomst als SUM (veld) ik moet dus een loopje maken. Heb ik 8 records komen er 8 queries... dit wil ik voorkomen...

Ik heb nu deze code maar nu zegt hij dat er een sytax error in HAVING zit
code:
1
2
3
4
5
SELECT orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum, Sum(orders.Aantal) AS AantalInBehandeling, Sum(behandeld.Aantal) AS AantalBehandeld, (AantalInBehandeling-AantalBehandeld) AS AantalNuInBehandeling
FROM orders
LEFT  JOIN behandeld ON (orders.Productcode = behandeld.Productcode) AND (orders.Ordernummer = behandeld.Ordernummer)
HAVING  AantalBehandeld < 1 OR (AantalBehandeld > 0 AND AantalNuInBehandeling > 0)
GROUP BY orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum;

Mijn help werkt niet meer en kan dus niet kijken hoe HAVING moet worden toegepast. Zoals ik het doe moet het dus niet, maar hoe wel?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

whoami schreef op 15 december 2003 @ 13:49:
[...]

HAVING gebruik je als je wilt filteren op een aggregated functie, zoals bv:
geef alle records waarvoor de som van veld A > 10
code:
1
2
3
SELECT *, sum(veldA) as blaat
FROM tabel
HAVING blaat > 10
mja, dat is toch wat TS wil? (nl. een SUM gebruiken in de 'where')

Voorbeeld dat ik in TSQL wel gebruik:
code:
1
2
3
4
5
6
7
8
9
10
create view vPostcodesDubbel as
select distinct (postcode), 
    huisnummer_min, 
    huisnummer_max,
    even_odd, 
    max(colodekking_id) as colodekking_id, 
    count(*) as aantal
from postcodes 
group by postcode, huisnummer_min, huisnummer_max,even_odd
having count(*)>1

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Hum, ja ok. Ik lag ff te slapen ofzo. :) :o

Als je dus wilt filteren op aggregated columns, doe je dat in de HAVING, en niet in de WHERE.

https://fgheysels.github.io/


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Aha! Ik heb hem... op één ding na...
code:
1
2
3
4
5
SELECT orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum, SUM(orders.Aantal) AS AantalInBehandeling, SUM(behandeld.Aantal) AS AantalBehandeld, (AantalInBehandeling-AantalBehandeld) AS AantalNuInBehandeling 
FROM orders
LEFT  JOIN behandeld ON (orders.Productcode = behandeld.Productcode) AND (orders.Ordernummer = behandeld.Ordernummer)
GROUP BY orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum
HAVING 0 OR SUM(behandeld.Aantal) < 1

Wanneer ik een veld heb waar SUM geen waarde heeft, laat hij het record niet zien. Geen waarde zou eigenlijk het getal 0 moeten zijn... maar dat doet hij niet... is hier een oplossing voor?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

SUM(isNULL(veld, 0))

edit:

haakjes tellen...

[ Voor 53% gewijzigd door pistole op 15-12-2003 14:20 ]

Ik frut, dus ik epibreer


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Wat doet die HAVING 0 daar?

Je kan eens kijken naar de ISNULL functie (als je Sql Server gebruikt). Met die functie kan je aangeven welke waarde er moet gebruikt worden als een column NULL is.

https://fgheysels.github.io/


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
De 0 heb ik gebruikt omdat de voorwaarden opgemaakt worden in het programma. Wanneer er geen voorwaarden zijn moet er geen enkele record zichtbaar zijn, dus 0.

Wanneer ik in Access IsNull gebruik zegt hij:
U hebt een onjuist aantal argumenten gebruikt in een functie. in query expressie SUM(IsNull (behandeld.Aantal, 0))

Is er een IsNull functie in "Access SQL"?

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

hmm, access kent alle de VBA isNull(bla), en niet de SQL functie.
Ik denk dat je daarom
-je datamodel moet aanpassen
OF
-een view moet maken die de NULL vervangt door een 0 (ik weet niet of ACCESS-SQL het CASE statement kent)

Ik frut, dus ik epibreer


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
pistole schreef op 15 december 2003 @ 14:42:
hmm, access kent alle de VBA isNull(bla), en niet de SQL functie.
Ik denk dat je daarom
-je datamodel moet aanpassen
OF
-een view moet maken die de NULL vervangt door een 0 (ik weet niet of ACCESS-SQL het CASE statement kent)
Sorry maar ik ben nog niet echt thuis in het (MS) SQL gebeuren... wat houdt een view in?
code:
1
HAVING 0 OR (SUM (behandeld.Aantal) < 1 OR SUM (behandeld.Aantal)  = NULL)
Werkt ook niet :'(

[ Voor 12% gewijzigd door Slagroom op 15-12-2003 14:48 ]


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

MSSQL:view
ACCESS:query

oftwel: maak een query op die tabel die netjes alle records 1:1 teruggeeft, behalve dan die kolom waarin je de NULL in een 0 wilt veranderen.

Ik frut, dus ik epibreer


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
pistole schreef op 15 december 2003 @ 14:46:
MSSQL:view
ACCESS:query

oftwel: maak een query op die tabel die netjes alle records 1:1 teruggeeft, behalve dan die kolom waarin je de NULL in een 0 wilt veranderen.
Maar ik wil juist die records weergeven...

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

dat bedoel ik.
Stel dat je tabel er zo uitziet:
tabel ariearie_idarie_namearie_aantal
1piet1
2klaas2
3gerritNULL

Nu, die NULL wil je vervangen door 0. Dus maak een view (query) die dát doet en hetvolgende resultaat oplevert
tabel ariearie_idarie_namearie_aantal
1piet1
2klaas2
3gerrit0

En vervolgens ga je je query waarmee je dit topic gestart bent loslaten op de view (query) ipv op de originele tabel.

* pistole weet alleen niet zeker of ACCESS SQL mogelijkheden heeft om direct in de SELECT een conditioneel statement mee te nemen

[ Voor 40% gewijzigd door pistole op 15-12-2003 15:03 ]

Ik frut, dus ik epibreer


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
maar dan moet je nog de NULL omzetten tot een 0. Of moet ik de data waar de NULL omgezet is tot een 0 (hoe doe ik dat?) in een nieuwe tabel pompen?

Sorry voor mijn vele vragen...

  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
Ik heb het denk ik!
code:
1
HAVING 0 OR (SUM (behandeld.Aantal) < 1 OR isnull(SUM (behandeld.Aantal)))
Bedankt voor jullie hulp!

Hele query:
code:
1
2
3
4
SELECT orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum, SUM(orders.Aantal) AS AantalInBehandeling, SUM(behandeld.Aantal) AS AantalBehandeld, (AantalInBehandeling-AantalBehandeld) AS AantalNuInBehandeling
FROM orders LEFT  JOIN behandeld ON (orders.Productcode = behandeld.Productcode) AND (orders.Ordernummer = behandeld.Ordernummer) 
GROUP BY orders.Ordernummer, orders.[Ordernummer cliënt], orders.Orderdatum, orders.Afleverdatum
HAVING 0 OR (SUM(behandeld.Aantal) < 1 OR IsNull (SUM(behandeld.Aantal)))

[ Voor 71% gewijzigd door Slagroom op 15-12-2003 15:12 ]


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 15:52

pistole

Frutter

Yep, dat zal werken. Dit is MS ACCESS's variant op de MSSQL ISNULL:

code:
1
 IIf( IsNull(veld), [waarde indien null], veld)

Ik frut, dus ik epibreer


  • Slagroom
  • Registratie: Juni 2001
  • Laatst online: 04-12-2025
pistole schreef op 15 december 2003 @ 15:09:
Yep, dat zal werken. Dit is MS ACCESS's variant op de MSSQL ISNULL:

code:
1
 IIf( IsNull(veld), [waarde indien null], veld)
Heej, daar had ik nooit aan gedacht, ook een oplossing! Zo zie je maar weer... "Er zijn meerde wegen die naar Rome leiden" :)
Pagina: 1