Toon posts:

[SQL] subqueries

Pagina: 1
Acties:

Verwijderd

Topicstarter
Even vooraf: Ik gebruik SQL Server

Er is een platte tabel met allemaal informatie daarin. Simpel gezegd is de basis 'een persoon' met daaraan gekoppeld nog wat meer informatie (over boetes bijvoorbeeld). Al deze informatie staat in 1 tabel en moet over meerdere tabellen verspreid gaan worden. Het ziet er ongeveer zo uit:

code:
1
2
3
4
5
6
7
8
ACHTERNAAM  NAAM   GEB        BOETE   ...  ...
Janssen     Jan    14-07-56   3426    ...  ...
Janssen     Jan    01-01-79   6654    ...  ...
Janssen     Jan    1979       8385
Klaassen    Klaas  21-03-64   2742
Klaassen    Klaas  21-03-64   8943
Klaassen    Klaas  21-03-64   8876
Frederiks   Fred   10-11-1977 6111


Zo zie je dus dat Klaas Klaassen drie boeten heeft gehad. Er komt dus uiteindeljik in de personentabel 1 record voor Klaas Klaasen en in de boetetabel drie records voor hem.

Maar je ziet ook dat Jan Janssen drie keer voorkomt met een andere geboortedatum. We gaan er vanuit dat de persoon met geb.datum 01-01-79 en 1979 hetzelfde is.

Ik wil dus de personen met dezelfde voor en achternaam maar een afwijkende geb.datum.
Maar hoe haal ik dit met een query naar boven? Ik probeer van alles met een COUNT te doen, maar ik kom er niet uit.
Ik dacht, ik hal eerste de dubbele voor+achternamen op, dan heb ik dus per persoon een uniek record. Vervolgens ga ik kijken hoeveel verschillende geboortedatums er bij die persoon zijn. Maar hoe programmeer je dit in sql?

Iemand een idee.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:26

gorgi_19

Kruimeltjes zijn weer op :9

Vervolgens ga ik kijken hoeveel verschillende geboortedatums er bij die persoon zijn. Maar hoe programmeer je dit in sql?
Wat heb je tot nu toe aan SQL statement dan? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
select distinct voornaam, familienaam, geboortedatum
zoiets ?

Trouwens, aangezien die datums allemaal verschillende representaties hebben, vermoed en vrees ik dat ze niet in een datetime veld opgeslagen zijn maar in een varchar veld ?

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Kijk eens naar GROUP BY en DATEPART

Roomba E5 te koop


Verwijderd

Topicstarter
Tot nu toe heb ik dit:

Haal alle dubbele namen op
code:
1
2
3
4
SELECT     Geslachtsnaam, Voornamen
FROM         [Tabel]
GROUP BY Geslachtsnaam, Voornamen
HAVING      (COUNT(*) > 1)



Haal de geb.datums op
code:
1
2
3
4
5
SELECT      geboortedatum 
FROM         ['2004']
GROUP BY Geslachtsnaam,  Voornamen, geboortedatum
HAVING (COUNT(*) > 1)
order by Geslachtsnaam


Maar nu moet er dus op een of andere manier een relatie tussen de twee resultaten gelegd worden in een query, denk ik.

[ Voor 4% gewijzigd door Verwijderd op 12-05-2005 13:22 ]


Verwijderd

Topicstarter
Het klopt trouwens dat de Datum als varchar is opgeslagen

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
select distinct voornaam, familienaam, geboortedatum (zoals ik al heb gezegd) zou je de unieke combinaties van voornaam familienaam en geboortedatum moeten geven.

Echter, als geboortedatum een varchar veld is, dan zou ik deze eerst converteren naar een datetime veld.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Je hebt gelijk dat je met een distinct over de namen + geb.datum de unieke records terugkrijgt.

Maar ik moet uiteindelijk in de personentabel slechts 1 record per persoon hebben.


Met een distinct alleen zou ik dus dit terugkrijgen:
code:
1
2
3
ACHTERNAAM  NAAM   GEB        BOETE   ...  ...
Janssen     Jan    01-01-79   6654    ...  ...
Janssen     Jan    1979       8385


Terwijl ik wil zien dat Jan Janssen dubbel is, en vervolgens dus slechts 1 van de twee in de database ga stoppen.

Aanvulling: en dat moet dus wel enigzins automatisch gaan, want het gaat om 50.000 records in totaal.

[ Voor 10% gewijzigd door Verwijderd op 12-05-2005 13:27 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
Verwijderd schreef op donderdag 12 mei 2005 @ 13:26:
Je hebt gelijk dat je met een distinct over de namen + geb.datum de unieke records terugkrijgt.

Maar ik moet uiteindelijk in de personentabel slechts 1 record per persoon hebben.


Met een distinct alleen zou ik dus dit terugkrijgen:
code:
1
2
3
ACHTERNAAM  NAAM   GEB        BOETE   ...  ...
Janssen     Jan    01-01-79   6654    ...  ...
Janssen     Jan    1979       8385
Nee, als je enkel achternaam, naam en geboortedatum selecteert, krijg je enkel de unieke combinaties van achternaam, naam en geb datum (maar eerst geb. datum naar datetime zetten).
Dan kan je dit doen:
code:
1
2
insert into tblPersonen (familienaam, voornaam, gebdatum)
SELECT distinct achternaam, naam, geb from tabel

https://fgheysels.github.io/


  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:11
whoami schreef op donderdag 12 mei 2005 @ 13:36:
[...]

Nee, als je enkel achternaam, naam en geboortedatum selecteert, krijg je enkel de unieke combinaties van achternaam, naam en geb datum (maar eerst geb. datum naar datetime zetten).
Dan kan je dit doen:
code:
1
2
insert into tblPersonen (familienaam, voornaam, gebdatum)
SELECT distinct achternaam, naam, geb from tabel
Ik geloof dat het punt is dat geboortedatum niet in een consistent formaat is opgeslagen. "01-01-79" en "1979" hebben betrekking op dezelfde persoon. Een oplossing hiervoor zou kunnen zijn om met stringfuncties van de database dit formaat te consisteren voordat je de distinct op de combinatie legt.

Regeren is vooruitschuiven


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:00
T-MOB schreef op donderdag 12 mei 2005 @ 13:42:
[...]


Ik geloof dat het punt is dat geboortedatum niet in een consistent formaat is opgeslagen. "01-01-79" en "1979" hebben betrekking op dezelfde persoon. Een oplossing hiervoor zou kunnen zijn om met stringfuncties van de database dit formaat te consisteren voordat je de distinct op de combinatie legt.
De beste oplossing is om dit veld te converten naar een datetime veld vooraleer de distinct uitgevoerd wordt.

https://fgheysels.github.io/


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:24
Er vanuitgaannde dat de geboortedatum dd-mm-yy is OF yyyy, en dezelfde namen met hetzelfde geboortejaar ALTIJD dezelfde persoon zijn, kan je ook met CONVERT een hoop bereiken:
code:
1
2
3
4
5
SELECT DISTINCT 
    Naam,
    Achternaam,
    DATEPART( Year, CONVERT( DateTime, Geboortedatum ) )
    ....
(Niet getest)

[ Voor 3% gewijzigd door sig69 op 12-05-2005 14:06 ]

Roomba E5 te koop

Pagina: 1