[ASP / SQL] Eerste record in tabel fout, de rest is okee..?

Pagina: 1
Acties:

  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
Ik heb in ASP een sql query gemaakt met een aantal SOM() functies.. Nu krijg ik, als ik met een LOOP een tabel maak, dat alles klopt.. behalve de eerste...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
SELECT DISTINCT 
  MaterialenlijstTotaal.artno, 
  MaterialenlijstTotaal.articleno, 
  MaterialenlijstTotaal.Parameter, 
  Max(MaterialenlijstTotaal.articledescription) AS EersteVanarticledescription, 
  Max(MaterialenlijstTotaal.supart) AS EersteVansupart, 
  Sum(MaterialenlijstTotaal.Totaal) AS Tot, 
  MaterialenlijstTotaal.Eenheid, 
  Sum(BulkLijst.AantalVerstuurd) AS SAantalVerstuurd, 
  Max(BulkLijst.DatumVerstuurd) AS LaatsteVanDatumVerstuurd, 
  Max(MaterialenlijstTotaal.ID) AS LaatsteVanID, 
  Max(MaterialenlijstTotaal.WOID) AS MaxVanWOID
FROM 
  BulkLijst 
RIGHT JOIN 
  MaterialenlijstTotaal ON BulkLijst.RemoteID = MaterialenlijstTotaal.ID
WHERE 
  (
    (
      (MaterialenlijstTotaal.WOID)=845 
    Or 
      (MaterialenlijstTotaal.WOID)=844 
    Or 
      (MaterialenlijstTotaal.WOID)=843 
    Or 
      (MaterialenlijstTotaal.WOID)=842 
    Or 
      (MaterialenlijstTotaal.WOID)=841
    )
  )
GROUP BY 
  MaterialenlijstTotaal.artno, 
  MaterialenlijstTotaal.articleno, 
  MaterialenlijstTotaal.Parameter, 
  MaterialenlijstTotaal.Eenheid
ORDER BY 
  MaterialenlijstTotaal.artno DESC , 
  MaterialenlijstTotaal.articleno DESC , 
  MaterialenlijstTotaal.Parameter DESC;


Dus de eerste die 'geprint' word is fout.. of een 1 of andere manier verdubbeld hij het...

Iemand een idee wat ik fout doe?

[ Voor 9% gewijzigd door dusty op 13-05-2004 18:43 . Reden: query leesbaar gemaakt ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 25-05 23:56
Waarom staat er een distinct in die query ?

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Wat bedoel je met verdubbelen?
En zou je de query wat minder breed willen maken, dat leest wat makkelijker?
Verder kun je (zeker in dit soort queries) beter right joins vermijden.

[ Voor 26% gewijzigd door cameodski op 13-05-2004 10:29 ]

Never underestimate the power of


  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
hmm .. ik heb geen idee.. dat haal ik er ook steeds uit.. acces houdt daar waarschijnlijk van ofzo.. die zet hem steeds terug erin.. :S.. maar dat is de oplossing ook niet.. :(

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Kan toch bijna niet anders of er zit een foutje in je loop?

  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
cameodski schreef op 13 mei 2004 @ 10:28:
Wat bedoel je met verdubbelen?
En zou je de query wat minder breed willen maken, dat leest wat makkelijker?
Verder kun je (zeker in dit soort queries) beter right joins vermijden.
Dit is het resultaat zonder SOM()
code:
1
2
3
artno   articleno   Parameter   EersteVanarticledescription EersteVansupart Tot Eenheid SAantalVerstuurd    LaatsteVanDatumVerstuurd    LaatsteVanID    Expr1010    WOID
TIS 8026        751     Mare Opaco 222303                   54  M                               41114       841     841
TIS 8026        751     Mare Opaco 222303                   56,4    M   106         23-2-2004           41603       844     844


En dit is het resultaat met som()
code:
1
2
artno   articleno   Parameter   EersteVanarticledescription EersteVansupart Tot Eenheid     SAantalVerstuurd    LaatsteVanDatumVerstuurd    LaatsteVanID    MaxVanWOID
TIS 8026        751     Mare Opaco 222303                   166,8   M       212         23-2-2004           41603       844


En dit verschil zit dus alleen in de eerst regel... [ik hoop dat het een beetje duidelijk is... ]

  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
Wezen schreef op 13 mei 2004 @ 10:36:
Kan toch bijna niet anders of er zit een foutje in je loop?
Voor zover ik weet zit daar geen foutje in... ik andere pagina's werkt het ook.. ik zal hieronder een verkorte versie plaatsen

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
'Hier begint de loop, zolang er items in de recordset zitten
Do While Not adoFour.EOF
%>

<td width="236"><%=adoFour("EersteVansupart")%></td>
<td width="28"><%=adoFour("Parameter")%></td>

<td width="91"><%=adoFour("Tot")%>&nbsp;<%=adoFour("Eenheid")%></td>

<td width="91"><%=response.Write((round((Verstuurd1)*100)/100))%>&nbsp;<%=adoFour("Eenheid")%></td>

<%
adoFour.MoveNext
Loop
%>

  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

Kijk nog even naar de opmerking van whoami, waarom staat er een distinct in?
Het lijkt erop dat er twee records zijn van Artikel TIS met exact dezelfde gegevens. Dat kun je zien in de kolom 'Tot', deze geeft zonder sum een totaal van 54 en 56,4 en zonder sum een totaal van 166,8. Maar 166,8 is toevallig precies (2*56,4) + 54.

Is dat je probleem? Zoniet dan begrijp ik de vraag niet.
Mijn advies is dus eigenlijk dezelfde als die van whoami, die distinct moet eruit want wanneer je de sum wilt weten wil je dat (meestal) van alle rijen doen, en niet van een distincte set.

42.7 percent of all statistics are made up on the spot.


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Het probleem zit in je join. Die zorgt er namelijk voor dat bepaalde records dubbel erin zitten.
Overigens zie je die niet, doordat je in de query zonder som en group by een distinct hebt staan.
Maar dat werkt bij een group by dus net even anders.

Ik denk dat je de totalen via een join op een select moet oplossen.

Never underestimate the power of


  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
Dat distinct is niet het probleem.. die heb ik er inmiddels al uit..

Het klopt dat er dubbele in staan...

Hij voegt de gegevens samen waar de 'artno', 'articleno' en 'Parameter' hetzelfde is...

Er staan 2 records in die met 'TIS, '8026' en '751'... dat zijn de gegevens die hij samen pakt en de gegevens die daarbij horen optelt..

Maar dit gebeurd bij meer dan alleen deze... wat nu het vreemde is dat hij het bij de rest wel prima doet...

  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
:S:S:S:S... d00d je hebt gelijk... er staat idd een dubbele in... :S:S:S.. *schaamte* _/-\o_ iedereen bedankt!..

  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
Maar even verder gaan op die JOINS.. hoe zou ik dat anders moeten doen dan??.. Dit werkt tot nu toe goed...

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ipv right joins, kun je beter left joins gebruiken. Dan krijg je dus dit:
code:
1
2
FROM MaterialenlijstTotaal
LEFT JOIN BulkLijst ON BulkLijst.RemoteID = MaterialenlijstTotaal.ID

Een goed RDBMS zal right joins omzetten naar left joins en dat betekent dus al min of meer dat right joins overbodig zijn.
Mijn grootste bezwaar tegen right joins is, dat de leesbaarheid bij eentje misschien nog gaat, maar als je meerdere right joins hebt, eventueel aangevuld met meerdere gewone joins en met left joins, is nauwelijks meer te begrijpen wat je query precies doet.

Never underestimate the power of


  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
Helaas krijg ik bij left join niet het gewenste resultaat... of doe ik dan iets niet goed... is het dus mogelijk om met left join hetzelfde resultaat te krijgen dan de right join...?

[ Voor 51% gewijzigd door bdu op 13-05-2004 14:10 ]


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
bdu schreef op 13 mei 2004 @ 14:09:
Helaas krijg ik bij left join niet het gewenste resultaat... of doe ik dan iets niet goed... is het dus mogelijk om met left join hetzelfde resultaat te krijgen dan de right join...?
Ik denk dat je dan inderdaad iets niet goed doet.
Een RDBMS voert als het goed is ipv een RIGHT JOIN gewoon een LEFT JOIN uit.

Never underestimate the power of


  • d00d
  • Registratie: September 2003
  • Laatst online: 16-09-2025

d00d

geen matches

Als je de code toch gaat aanpassen zou ik het zo doen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT  mt.artno,
    mt.articleno,
    mt.Parameter,
    Max(mt.articledescription) AS EersteVanarticledescription,
    Max(mt.supart) AS EersteVansupart,
    Sum(mt.Totaal) AS Tot,
    mt.Eenheid,
    Sum(b.AantalVerstuurd) AS SAantalVerstuurd,
    Max(b.DatumVerstuurd) AS LaatsteVanDatumVerstuurd,
    Max(mt.ID) AS LaatsteVanID,
    Max(mt.WOID) AS MaxVanWOID
FROM    MaterialenlijstTotaal mt LEFT JOIN BulkLijst b ON mt.ID = b.RemoteID
WHERE   mt.WOID BETWEEN 841 AND 845
GROUP BY mt.artno, mt.articleno, mt.Parameter, mt.Eenheid
ORDER BY mt.artno DESC, mt.articleno DESC, mt.Parameter DESC;

42.7 percent of all statistics are made up on the spot.


  • bdu
  • Registratie: Februari 2002
  • Laatst online: 25-05 22:19
d00d, ziet er idd mooi uit.. maar is dit echt sneller?.. Zal je dit merken? Zoja wat zal het schelen?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
bdu schreef op 13 mei 2004 @ 18:35:
d00d, ziet er idd mooi uit.. maar is dit echt sneller?.. Zal je dit merken? Zoja wat zal het schelen?
De BETWEEN zou eventueel wat snelheidswinst op kunnen leveren, maar of het in een intelligent RDBMS veel scheelt, vraag ik me heel erg af.

Never underestimate the power of

Pagina: 1