[SQL] Access: sum van bepaalde velden

Pagina: 1
Acties:

  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
* sorry voor topictitel, weet niet goed wat het probleem in 1 zin samenvat...

Ik heb een tabel met twee velden, volgNum en hoeveelheid; volgNum is een serienummer, opgebouwd uit 12 cijfers. De eerste 10 cijfers zijn uniek, geven een transactie aan. De laatste 2 cijfers geven een volgnummer van de transactie aan. Het kan dus zijn dat het volgnummer tot 06 oploopt (of iets dergelijks); het gaat er om dat ik dat niet vantevoren kan weten.


code:
1
2
3
4
5
6
7
8
volgNum                Hoeveelheid
--------------------------------------------------
243610380101   |    62,5200004577637
243610380201   |    33,7999992370605
243610380202   |    10,2399997711182
243610380301   |    32,8899993896484
243610380401   |    31,3099994659424
--------------------------------------------------


Ik ben naar iets op zoek waardoor ik de waarden van transacties met hetzelfde nummer (243610380201 en 243610380202) op kan tellen., oftewel, dat ik op volgnummer kan gaan selecteren bij optellen.

Het volgende heb ik geproduceerd, maar dan krijg ik gewoon de originele waarden terug als output 8)7

code:
1
2
3
4
SELECT  volgNum, SUM(totaal_hoeveelheid)
FROM volgNumHoeveelheidTabel
WHERE volgNum LIKE left(volgNum,10)&'**'
GROUP BY volgNum, totaal_hoeveelheid


Iemand een ideetje ?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

SQL:
1
2
3
4
SELECT  volgNum, SUM(totaal_hoeveelheid)
FROM volgNumHoeveelheidTabel
WHERE volgNum LIKE left(volgNum,10)&'**'
GROUP BY volgNum

?

edit:

Niet goed gelezen dus... |:( groeperen op eerste 10 cijfers

[ Voor 38% gewijzigd door gorgi_19 op 19-12-2003 12:47 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
Ik dacht (*dacht* :)) met die where clausule wat te kunnen selecteren op de eerste 10 cijfers van het volgnummer

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

:?

Ik heb totaal_hoeveelheid uit je group by clausule gesloopt, omdat die er helemaal niet in thuishoort, afaik. Je wilt namelijk niet groeperen op dit veld.

edit:

Ah, nu snap ik het... :)

[ Voor 37% gewijzigd door gorgi_19 op 19-12-2003 12:46 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
De kriebels lopen over mijn rug en ik bedoel niet die goeie. Heb je wel eens gehoord van normaliseren? Nou ja, degene die de tabel heeft ontworpen dan, dat hoef jij natuurlijk niet te zijn.

In ieder geval is de group by de oorzaak van het leed. Ik weet niet wat voor database het is waar je op werkt, maar je zou kunnen proberen een group by op left(volgnum,10) bladibla te doen, misschien dat ie dat vreet. En group by op totaal_hoeveelheid moet je zeker niet doen...

  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
ja inderdaad, die stond er per ongeluk nog in, maar dat doet niets af aan de output die ik krijg

  • jwpmzijl
  • Registratie: December 2002
  • Laatst online: 27-05 23:44
Dit geeft een kolom met alleen de transactienummers. Op deze kolom wordt geselecteerd. Vervolgens voeg je de kolom toe die je wilt optellen.
code:
1
2
3
SELECT Left([faktuurnummer],6) AS Expr1
FROM Fakturen
GROUP BY Left([faktuurnummer],6);


Dit probleem heb je niet als jij een beter datamodel hanteert (normalisatie zoals eerder gezegd). Ik ga er even vanuit dat je geen invloed hebt op dat datamodel maar dat je de data vanuit andere bron krijgt.

[ Voor 30% gewijzigd door jwpmzijl op 19-12-2003 12:47 ]

Hans van Zijl


  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
bigbeng schreef op 19 december 2003 @ 12:45:
maar je zou kunnen proberen een group by op left(volgnum,10) bladibla te doen, misschien dat ie dat vreet. En group by op totaal_hoeveelheid moet je zeker niet doen...
Heb ik al geprobeerd, maar dan moet ik (van Access) in de select precies hetzelfde doen, anders pakt ie 'm niet, maar dan krijg ik nog steeds dezelfde output, alleen met 10 cijfers in plaats van 12

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Kun je niet de tabel uitbreiden met twee extra velden?

LinkerGedeelteVanHetNummer
RechterTweeCijfersVanHetNummer

Deze hoef je slechts eenmaal de vullen(bij het toevoegen van een record) en kun je daarna in queries als bovenstaande gebruiken. Voordeel is dan ook dat je indexen kunt gebruiken, dat lukt niet als je een LEFT() of iets dergelijks gebruikt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
P_de_B schreef op 19 december 2003 @ 12:49:
Kun je niet de tabel uitbreiden met twee extra velden?

LinkerGedeelteVanHetNummer
RechterTweeCijfersVanHetNummer

Deze hoef je slechts eenmaal de vullen(bij het toevoegen van een record) en kun je daarna in queries als bovenstaande gebruiken. Voordeel is dan ook dat je indexen kunt gebruiken, dat lukt niet als je een LEFT() of iets dergelijks gebruikt.
Hoe wou je dit verder aan gaan pakken ? dan krijg ik nog steeds dubbele transactie nummers terug..

De opmerkingen over beter datamodel zijn terecht en heb ik zelf al eerder bij mijn baas geplaatst, maar ik zit nu eenmaal aan deze opzet vast :(

[ Voor 12% gewijzigd door VonAalscht op 19-12-2003 12:53 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Huurmoordenaars schreef op 19 december 2003 @ 12:52:
[...]


Hoe wou je dit verder aan gaan pakken ? dan krijg ik nog steeds dubbele transactie nummers terug..
Nee hoor, je kunt dan een group by op LinkerGedeelteVanHetNummer (2436103802) doen en niet op HeleNummerDatEenBeetjeRaarIs ( 243610380201), dat was toch de bedoeling?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik heb het volgende ff getest:

code:
1
2
3
4
SELECT Left(volgNum,10) AS Expr1, Sum(volgNumHoeveelheid.hoeveelheid) AS SomVanhoeveelheid
FROM volgNumHoeveelheid
WHERE (((volgNumHoeveelheid.volgnum) Like Left([volgNum],10) & '**'))
GROUP BY Left(volgNum,10);


en dat gaf als resultaat:

code:
1
2
3
Expr1   SomVanhoeveelheid
0123456789  35,695424
0123456798  246,23


gebruikte gegevens:
code:
1
2
3
4
5
volgnum hoeveelheid
012345678901    12,238724
012345678902    23,4567
012345679801    123
012345679802    123,23


Dit is toch het antwoord op je vraag?

  • VonAalscht
  • Registratie: November 2001
  • Laatst online: 27-05 14:30
bigbeng, precies wat ik zocht, bedankt ! (iedereen) _/-\o_

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Huurmoordenaars schreef op 19 december 2003 @ 13:04:
bigbeng, precies wat ik zocht, bedankt ! (iedereen) _/-\o_
maar let op dat eventuele indexen op volgnum niet worden gebruikt.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
P_de_B schreef op 19 december 2003 @ 13:09:
[...]

maar let op dat eventuele indexen op volgnum niet worden gebruikt.
Waarom denk je dat?
Volgens mij gaat de index die daarop ligt wel gebruikt worden, aangezien je enkel wildcards toevoegt aan de rechterkant in je WHERE.

https://fgheysels.github.io/


  • Maasluip
  • Registratie: April 2002
  • Laatst online: 08:44

Maasluip

Kabbelend watertje

bigbeng schreef op 19 december 2003 @ 13:01:
Ik heb het volgende ff getest:

code:
1
2
3
4
SELECT Left(volgNum,10) AS Expr1, Sum(volgNumHoeveelheid.hoeveelheid) AS SomVanhoeveelheid
FROM volgNumHoeveelheid
WHERE (((volgNumHoeveelheid.volgnum) Like Left([volgNum],10) & '**'))
GROUP BY Left(volgNum,10);
Die whereclause is niet nodig. Omdat je toch groepeert op Left(volgNum,10) heb je al alles wat je wil.

Signatures zijn voor boomers.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Omdat je een functie ( LEFT() ) toepast op het veld, SQL Server gebruikt dan geen indexen meer. Ik neem aan dat Access dit ook niet doet.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Hij gebruikt idd een LEFT, maar hij doet dat niet op één van z'n tabel-velden in z'n where clausule, maar op het criteria-veld.
Mocht het idd zo zijn, dat er ook dan geen indexen gebruikt worden, dan kan je het alsnog omzeilen door eerst die substring te doen (in je client applicatie dus), en die substring dan door te geven als parameter aan je query.

https://fgheysels.github.io/

Pagina: 1