[SQL] Query mogelijk?

Pagina: 1
Acties:

  • Vozze
  • Registratie: December 2001
  • Laatst online: 20-08 22:02
Ik ben bezig met ene query, maar ik kom er niet helemaal uit. Ik heb een tabel met de volgende velden:

PDNummerParentBedrag
pd0302829566
pd030658pd0302823366
pd030659pd0302826199
pd030660pd030658742

Ik wil nu met een query een bedrag per PDNummer. Dit bedrag moet bestaan uit het bedrag dat achter het PDNummer staat - het bedrag van de PD('s) die als parent de desbetreffende PD heeft.
Ik heb nu de volgende query:
code:
1
2
SELECT PDs.PDnummer, Bedrag - (Select sum( bedrag) from PDs where Parent = PDNummer)
FROM PDs;

Hier krijg ik dus geen waarde terug. Dit is ook wel logisch, omdat het niet voorkomt dat een PDNummer als Parent hetzelfde PDNummer heeft. Weet iemand of dit mogelijk is en in welke richting ik moet zoeken?
Alvast bedankt!

"He who thinks knows evertyhing, knows nothing" - Socrates


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Euhm, vage query die je daar zelf uitgedoktert hebt.

Echter, ik snap 1 ding niet: je wilt een bedrag per PD nummer? Ik zie dat ieder PD nummer uniek is, dus kan je per PD nummer slechts 1 bedrag hebben?
Als je het bedrag per 'Parent' wil, kan je dit eenvoudig doen dmv een SUM en een group by:
code:
1
2
3
select parent, sum(bedrag)
from tabel
group by parent

https://fgheysels.github.io/


  • Vozze
  • Registratie: December 2001
  • Laatst online: 20-08 22:02
whoami schreef op 17 november 2003 @ 10:23:
Euhm, vage query die je daar zelf uitgedoktert hebt.

Echter, ik snap 1 ding niet: je wilt een bedrag per PD nummer? Ik zie dat ieder PD nummer uniek is, dus kan je per PD nummer slechts 1 bedrag hebben?
Als je het bedrag per 'Parent' wil, kan je dit eenvoudig doen dmv een SUM en een group by:
code:
1
2
3
select parent, sum(bedrag)
from tabel
group by parent
whoami, het klopt dat een PDNummer uniek is. Het kan voorkomen dat een PDnummer weer bestaat uit meerdere PD's. Dan is de PD de parent. Als je kijkt in de tabel zie je dat pd030282 de parent is van pd030658 en pd030659. Nu wil ik een query die mij het bedrag van de PD (pd030282) geeft met daarvan afgetrokken de bedragen van de PD's die de desbeteffende PD als parent hebben. In dit geval 3366 en 6199. Ik wil dus als result 1 krijgen (9566 - (3366 + 6199)). En dat voor alle PD's. Dus dat ik een tabel krijg zoals volgt:

PDNummerUiteindelijkBedrag
pd0302821 (9566 - (3366 + 6199))
pd0306582624 (3366 - 742)
pd0306596199
pd030660742

"He who thinks knows evertyhing, knows nothing" - Socrates


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Kan je zo niet iets forceren:
code:
1
2
3
select bedrag - (SELECT SUM(bedrag) FROM tabel WHERE parent = tabel2.pdnummer)
FROM tabel AS tabel2
WHERE tabel2.pdnummer = pd0303282

:?

https://fgheysels.github.io/


  • Vozze
  • Registratie: December 2001
  • Laatst online: 20-08 22:02
whoami schreef op 17 november 2003 @ 10:38:
Kan je zo niet iets forceren:
code:
1
2
3
select bedrag - (SELECT SUM(bedrag) FROM tabel WHERE parent = tabel2.pdnummer)
FROM tabel AS tabel2
WHERE tabel2.pdnummer = pd0303282

:?
Dit werkt wel, maar dan geef je hard op van welk pdnummer je het bedrag wilt hebben. Ik wil dus van alle PDnummers het uiteindelijke bedrag. Die pd030282 moet dus variabel zijn.

"He who thinks knows evertyhing, knows nothing" - Socrates


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Dan laat je die WHERE weg, en schrijf je je select zo:
code:
1
2
SELECT tabel2.pdnummer, tabel2.bedrag - ( SELECT ...... 
FROM tabel AS tabel2

https://fgheysels.github.io/


  • Vozze
  • Registratie: December 2001
  • Laatst online: 20-08 22:02
whoami schreef op 17 november 2003 @ 10:49:
Dan laat je die WHERE weg, en schrijf je je select zo:
code:
1
2
SELECT tabel2.pdnummer, tabel2.bedrag - ( SELECT ...... 
FROM tabel AS tabel2
Geweldig! Dit is het. Je moet dus een tweede "virtuele" tabel (gelijk aan tabel 1) aanmaken. Super whoami. Bedankt!

"He who thinks knows evertyhing, knows nothing" - Socrates


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 20-08 21:53
Bij mij geeft de vorige query niet wat de TS wil:
SQL:
1
2
3
4
5
SELECT PDnummer,bedrag - 
  (
  SELECT SUM(bedrag) FROM PDs WHERE parent = tabel2.pdnummer
  )
FROM PDs AS tabel2


geeft namelijk (MSSQL2000):
code:
1
2
3
4
5
6
PDnummer               
---------- ----------- 
PD030282   1
PD030258   2624
PD030659   NULL
PD030660   NULL



Voor het juiste resultaat moet er een ISNULL tussen:
SQL:
1
2
3
4
5
  SELECT PDnummer, bedrag - ISNULL(
  (
  SELECT SUM(bedrag) FROM PDs WHERE parent = tabel2.pdnummer),0
  )
FROM tabel AS tabel2


Dit geeft wat de TS wil, namelijk:
code:
1
2
3
4
5
6
PDnummer               
---------- ----------- 
PD030282   1
PD030258   2624
PD030659   6199
PD030660   742



Maar ik heb het idee dat dit dan een nettere manier is:
SQL:
1
2
3
4
5
6
SELECT PDs.PDnummer, Bedrag-ISNULL(Som,0) FROM PDs
  LEFT OUTER JOIN 
  (
    SELECT Parent AS PDNummer, SUM(Bedrag) AS Som FROM PDs GROUP BY Parent
  ) Parents 
  ON Parents.PDnummer=PDs.PDnummer


Dit ziet er netter uit (subjectief), maar levert volgens de MSSQL2000 optimizer hetzelfde resultaat.

[ Voor 4% gewijzigd door jvdmeer op 17-11-2003 18:22 . Reden: opmaak en afbreking ]


  • Vozze
  • Registratie: December 2001
  • Laatst online: 20-08 22:02
jvdmeer:
Je hebt gelijk. Ik kreeg gisteren namelijk al waarden terug die ik niet begreep. Een NULL van een getal aftrekken werkt dus niet. Weer wat geleerd. Ook wel logisch aan 1 kant. Ik heb er nu ISNULL van gemaakt en dan NULL vervangen door een 0.
Bedankt voor al jullie hulp!

"He who thinks knows evertyhing, knows nothing" - Socrates

Pagina: 1