[SQL] UNION en gelijke id verwijderen

Pagina: 1
Acties:

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
Ok allereerst wil ik mijn excuses aanbieden voor mijn titel. Ik weet helaas geen titel die mijn probleem wel goed beschrijft.

Wat wil ik doen. Ik heb twee tabellen. Met een aantal en een artikelid. Ik wil de tabellen samenvoegen. Hierbij wil ik de records met de zelfde artikelids verwijderen (zodat er maar één record per artikelid is) zonder dat het aantal wordt opgeteld. Tot nu toe heb ik wel een mooie UNION maar nu staan er dus dubbele artikelids in. Dit is hoe mijn instructie eruit ziet.

code:
1
2
3
4
5
6
7
8
SELECT SUM(inkoopaantal+retouraantal) AS aantal, i.artikelid
FROM inkoopoverzicht AS i, retouroverzicht AS r
WHERE i.artikelid=r.artikelid
GROUP BY i.artikelid
UNION
SELECT SUM(aantal), artikelid
FROM inkoop
GROUP BY artikelid


Afbeeldingslocatie: http://www.voossanen.speedxs.nl/fout.JPG

Ik hoop dat iemand mij kan helpen, ben nogal nieuw in het hele SQL gebeuren, dus wees lief voor me.

Alvast bedankt _/-\o_

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Je zult een subquery moeten opnemen. Ik ga er voor het gemak even vanuit dat je de records uit je 1e query prioriteit geeft over de 2e query. Het zou dan iets worden als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT SUM(inkoopaantal+retouraantal) AS aantal, i.artikelid
FROM inkoopoverzicht AS i, retouroverzicht AS r
WHERE i.artikelid=r.artikelid
GROUP BY i.artikelid
UNION
SELECT SUM(aantal), artikelid
FROM inkoop
WHERE artikelid NOT IN (
  SELECT i.artikelid
  FROM inkoopoverzicht AS i, retouroverzicht AS r
  WHERE i.artikelid=r.artikelid  
)
GROUP BY artikelid

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 18:07
UIt welke van de twee tabellen moeten de records worden verwijderd?

En besef je dat het meer records zijn die verwijderd zouden moeten worden? Je gebruikt in beide tabellen een 'GROUP BY' dus de 2 records die verschijnen zijn weer een optelling van meerdere records.

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
bigbeng schreef op dinsdag 17 januari 2006 @ 19:10:
Je zult een subquery moeten opnemen. Ik ga er voor het gemak even vanuit dat je de records uit je 1e query prioriteit geeft over de 2e query. Het zou dan iets worden als:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT SUM(inkoopaantal+retouraantal) AS aantal, i.artikelid
FROM inkoopoverzicht AS i, retouroverzicht AS r
WHERE i.artikelid=r.artikelid
GROUP BY i.artikelid
UNION
SELECT SUM(aantal), artikelid
FROM inkoop
WHERE artikelid NOT IN (
  SELECT i.artikelid
  FROM inkoopoverzicht AS i, retouroverzicht AS r
  WHERE i.artikelid=r.artikelid  
)
GROUP BY artikelid
Damn ik ben daar hele tijd mee bezig geweest, met die subqueries maar bleef errors krijgen. Maar als ik hem zo zie issie heel logisch. Echt hartstikke bedankt. En wederom een supersnelle reactie hierzom fantastisch _/-\o_
jvdmeer schreef op dinsdag 17 januari 2006 @ 19:11:
UIt welke van de twee tabellen moeten de records worden verwijderd?

En besef je dat het meer records zijn die verwijderd zouden moeten worden? Je gebruikt in beide tabellen een 'GROUP BY' dus de 2 records die verschijnen zijn weer een optelling van meerdere records.
Ik begrijp niet geheel wat jij wil zeggen? Ik maak met die UNION toch weer een nieuwe tabel en daar wil ik toch gewoon die records uit verwijderen?

[ Voor 23% gewijzigd door Jilvoos op 17-01-2006 19:22 ]


  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
Ok nieuw probleempje.

Ik heb bij een soortgelijke UNION een keer dat bij de SUM(verkoopaantal+dervingaantal) de waarde dervingaantal wel aanwezig is voor een artikelid en verkoopaantal niet. Dit zorgt er dus voor dat dit artikelid niet in mijn samengevoegde tabel komt. Hoe los ik dit het best op?

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
De tabel waar het aantal wel in voorkomt moet je LEFT (OUTER) JOIN en met de tabel waar hij misschien in voorkomt. Query-snippet (en ik ga voor mijn gemak even uit van MSSQL:
code:
1
2
3
4
SELECT SUM(inkoopaantal+retouraantal) AS aantal, i.artikelid
FROM retouroverzicht AS r
LEFT OUTER JOIN inkoopoverzicht AS i ON i.artikelid=r.artikelid
... (rest)


Lees voor het gebruik wel eerst de aanwijzingen voor joins en left joins ;) :
klikkerdeklik

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
bigbeng schreef op woensdag 18 januari 2006 @ 07:41:
De tabel waar het aantal wel in voorkomt moet je LEFT (OUTER) JOIN en met de tabel waar hij misschien in voorkomt. Query-snippet (en ik ga voor mijn gemak even uit van MSSQL:
code:
1
2
3
4
SELECT SUM(inkoopaantal+retouraantal) AS aantal, i.artikelid
FROM retouroverzicht AS r
LEFT OUTER JOIN inkoopoverzicht AS i ON i.artikelid=r.artikelid
... (rest)


Lees voor het gebruik wel eerst de aanwijzingen voor joins en left joins ;) :
klikkerdeklik
Ok ik snap wel wat de bedoeling is, maar krijg het niet voor elkaar.
Code ziet er zo uit

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT SUM(v.aantal+d.aantal) AS aantal, v.artikelid
FROM derving AS d
LEFT OUTER JOIN verkoop AS v ON v.artikelid=d.artikelid
WHERE v.artikelid=d.artikelid
GROUP BY v.artikelid
UNION SELECT SUM(aantal), artikelid
FROM verkoop
WHERE artikelid NOT IN
(
  SELECT v.artikelid
  FROM verkoop AS v, derving AS d
  WHERE v.artikelid=d.artikelid  
)
GROUP BY artikelid;


In verkoop een artikelid niet voor die in derving dus wel voorkomt. Als ik de code uitvoer krijg ik echter een code waar dit artikelid toch ontbreekt. En ik kom er niet echt uit. Dus als iemand nog iets weet, ik hoor het graag.

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Maak van die group by eens:
GROUP BY d.artikelid
Je groepeert nu op een niet bestaande id. Ik weet niet zeker of dit de issue is, maar het lijkt me in ieder geval het proberen waard.

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
bigbeng schreef op woensdag 18 januari 2006 @ 11:07:
Maak van die group by eens:
GROUP BY d.artikelid
Je groepeert nu op een niet bestaande id. Ik weet niet zeker of dit de issue is, maar het lijkt me in ieder geval het proberen waard.
Die artikelid bevindt zich in de tabel verkoop. En als ik er simpelweg d.artikelid van maak dan maakt die geen deel uit van de statische functie (acces-melding).

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
als er artikelid's wel in derving en niet in verkoop kunnen voorkomen, dan is derving dus leidend geworden (tenminste, zo is de query nu). Je zult dan overal waar je artikelid gebruikt dus die van derving moeten gebruiken. Dus ook in je SELECT deel, die had ik alleen over het hoofd gezien.

  • Jilvoos
  • Registratie: Maart 2003
  • Laatst online: 16:50
bigbeng schreef op woensdag 18 januari 2006 @ 12:48:
als er artikelid's wel in derving en niet in verkoop kunnen voorkomen, dan is derving dus leidend geworden (tenminste, zo is de query nu). Je zult dan overal waar je artikelid gebruikt dus die van derving moeten gebruiken. Dus ook in je SELECT deel, die had ik alleen over het hoofd gezien.
Ik heb hem!!
Eerst even laten zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT SUM(d.aantal) AS aantal, d.artikelid
FROM artikel AS a, derving AS d
WHERE d.artikelid=a.artikelid
GROUP BY d.artikelid
UNION
SELECT SUM(aantal), artikelid
FROM verkoop
WHERE artikelid NOT IN 
(
  SELECT v.artikelid
  FROM verkoop AS v, derving AS d
  WHERE v.artikelid=d.artikelid  
)
GROUP BY artikelid;


Ik vergeleek mijn derving.artikelids elke keer met een tabel waar niet alle ids in voorkwamen, nu heb ik dat dus wel gedaan en nu kloptie. Helaas ben ik nu pas op de helft aangezien ik nu deze tabel moet vergelijken met de tabel in mijn TS.
Maar jullie alvast bedankt voor de hulp. _/-\o_
Pagina: 1