Toon posts:

[SQL] uniek client id uit een range. hoe? *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Mensen,

Ik ben een leek op het gebied van SQL, vandaar dat ik jullie hulp hard nodig heb. Mijn probleem kan niet moeilijk zijn... misschien dat ik daarom nergens een antwoord heb kunnen vinden.

Ik heb een Access database met daarin klantgegevens.Deze klanten hebben allemaal een uniek id (PAYR-ID). Per id kunnen wel meerdere accounts (ACC NO) bestaan. Deze accounts hebben allemaal een eigen startdatum (STRT DT). Elke account is opgeslagen in een eigen record.

Ik wil het volgende bereiken:
Mijn query moet de PAYR-ID's geven van klanten die een account in een bepaalde periode geopend hebben, maar daarvoor nog geen account hadden. Hierbij mag elke PAYR-ID maar 1x voorkomen in het resultaat. Het probleem is dat ik met onderstaande query meerdere resultaten per PAYR-ID krijg, omdat de STRT DT onder verschillende records zijn opgeslagen. Ik heb al distinct en distinctrow gebruikt, maar dat werkt niet goed, omdat alle records verschillend zijn. Ook is het moeilijk de PAYR-ID's die al een ACC NO hadden voor de betreffende periode eruit te laten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT  
             [February04 (Subat)].[PAYR-ID], 
             [February04 (Subat)].[STRT DATE], 
             [February04 (Subat)].[ACC NO],
             [February04 (Subat)].[ACC NAME]

FROM [February04 (Subat)] 

WHERE ((([February04 (Subat)].[STRT DATE]) Between #2/1/2004# And #2/29/2004#))

GROUP BY [February04 (Subat)].[PAYR-ID], 
             [February04 (Subat)].[STRT DATE],           
             [February04 (Subat)].[ACC NO],
             [February04 (Subat)].[ACC NAME]


ORDER BY [February04 (Subat)].[PAYR-ID]
;


Alvast onwijs bedankt!

[ Voor 5% gewijzigd door Verwijderd op 18-03-2005 10:59 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
twee tips:
1 lees de faq voor topicstarts
2 subquery en Google levert je meer info

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:57

Dido

heforshe

Welk record wil je zien per PAYR-ID? Als je die vraag niet beantwoordt, weet SQL het ook niet.

[ Voor 3% gewijzigd door Dido op 18-03-2005 10:46 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ik wil de STRT DT, en de ACC NAME zien.... als dat eenmaal lukt, wil ik ook een ander veld REVENUE voor alle ACC NO per PAYR-ID bij elkaar optellen en zien.

Weet niet of iemand hier iets mee kan...

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:57

Dido

heforshe

Maar *welke* STRT DT wil je zien als er meer dan 1 per PAYR ID zijn :?

Je probleem is dat je er meerder ziet, dat wil je niet, maar je verwacht van SQL dat ie beslist welke je te zien krijgt?

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ik snap wat je bedoelt. Ik wil dat hij de STRT DT weergeeft die voldoen aan de andere restrictie: vallend tussen 01/02/04 en 29/02/04.

Dus in andere woorden wil ik hetvolgende zien:
-De PAYR accounts die 1 ACC NO hebben waarvan de STRT DT valt in de restriktie
-De PAYR accounts die meerdere ACC NO hebben waarvan er 1 of meerdere in de restriktie vallen. Deze 2de categorie wil ik slechts 1x zien.

Maar hoe vertel ik SQL dit???

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

kijk eens naar:
inner/outer join
subquery
count(kolomnaam)
AS, IN, group by, having

voorbeeld die je misschien verder helpt:
Select PAYR ID
from tabelnaam
group by PAYR ID
having count(ACC NO) < 2

Die query zou all PAYR IDs moeten laten zien met maar 1 ACC NO.

[ Voor 6% gewijzigd door GambitRS op 18-03-2005 13:16 ]

MechWarrior || Monsters Game


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:57

Dido

heforshe

Verwijderd schreef op vrijdag 18 maart 2005 @ 13:03:
-De PAYR accounts die meerdere ACC NO hebben waarvan er 1 of meerdere in de restriktie vallen. Deze 2de categorie wil ik slechts 1x zien.
Ik val in herhaling, maar welke van die ACCNO's wil je dan zien? De eerste, de laatste, een willekeurige (Dat wordt lastig!)?

Als je dus krijgt
code:
1
2
3
4
PAYR - ACCNO - STRTDAT
1        3              050105
2        4              060105
3        5              100105

Wil je dan PAYR 1, 2 of 3 :?
Maar hoe vertel ik SQL dit???
Dat is simpel, zodra je weet *wat* je SQL wilt vertellen. Tegen SQL zeggen "ik wil er maar 1" terwijl hij er 10 heeft, gaat nooit werken.

Als jij auto's verkoopt, en ik vertel je dat ik een blauwe wil, dan weet jij nog steeds niet welke van de 20 blauwe auto's ik wil hebben.

edit: GambitRS: Maar dan vergeet je punt 2, en dat is nu net het hele punt. Het is volslagen onduidelijk welk record je wilt zien als er meerdere zijn :)

[ Voor 10% gewijzigd door Dido op 18-03-2005 13:13 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Dank voor de reply's. Interessante metafoor trouwens ;)

Voor de bedoelingen die ik heb maakt het niet zoveel uit welke. Laten we zeggen dat ik de nieuwste datum wil zien. Wat gebeurt er overigens als meerdere STRT DT van een PAYR hetzelfde zijn? (iets wat vaker voorkomt, omdat een PAYR op een dag meerdere accounts afsluit)

Verwijderd

Topicstarter
Wacht even. Zou ik niet iets kunnen doen met EXISTS ?

Ik stel eigenlijk de vraag: Bestaat voor een PAYR de STRT DT die valt tussen x en y. Zoja, geef mij het PAYR ID.

  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

Dido schreef op vrijdag 18 maart 2005 @ 13:11:
[...]

edit: GambitRS: Maar dan vergeet je punt 2, en dat is nu net het hele punt. Het is volslagen onduidelijk welk record je wilt zien als er meerdere zijn :)
Daarom geef ik een hint die hem kan helpen om het op te lossen in plaats van dat ik meteen het hele antwoord geef. Daar was het probleem voor mij toch niet duidelijk genoeg voor :)

Als je echt maar 1 result wilt hebben per account ID dan is dat misschien wel mogelijk met een subquery in een subquery in een subquery (het bedenken van die query kost mij zelfs al veel tijd, dus als je er geen ervaring mee hebt zou ik het laten) terwijl het achteraf eruit filteren van records die je niet nodig hebt m.b.v. een programmeer taal 5 regels code is. Tel uit je winst :)

MechWarrior || Monsters Game


  • GambitRS
  • Registratie: Juni 2001
  • Laatst online: 13-06-2013

GambitRS

w00t

Verwijderd schreef op vrijdag 18 maart 2005 @ 13:23:
Wacht even. Zou ik niet iets kunnen doen met EXISTS ?

Ik stel eigenlijk de vraag: Bestaat voor een PAYR de STRT DT die valt tussen x en y. Zoja, geef mij het PAYR ID.
Select PAYR
from tabelnaam
where PAYR in
( Select PAYR
from tabelnaam
where STR DT between x and y
)

MechWarrior || Monsters Game


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:57

Dido

heforshe

Met een subquery lijkt het me ingewikkeld worden.

Waarom dan niet simpelweg:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT  
             [February04 (Subat)].[PAYR-ID], 
             MIN([February04 (Subat)].[STRT DATE]), 
             [February04 (Subat)].[ACC NO],
             [February04 (Subat)].[ACC NAME]

FROM [February04 (Subat)] 

WHERE ((([February04 (Subat)].[STRT DATE]) Between #2/1/2004# And #2/29/2004#))

GROUP BY [February04 (Subat)].[PAYR-ID],
             [February04 (Subat)].[ACC NO],
             [February04 (Subat)].[ACC NAME]

ORDER BY [February04 (Subat)].[PAYR-ID]
;

Dan heb je ook maar 1 result per PAYR ID.

edit: Je moet ook nog een aggregate loslaten op je ACCNO en NAME, anders werkt het nog niet 8)7.
Alleen horen ze dan weer niet bij elkaar |:(

Zoiets is dan logischer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  
             [February04 (Subat)].[PAYR-ID], 
             MIN([February04 (Subat)].[ACC NO])

FROM [February04 (Subat)] 

WHERE ((([February04 (Subat)].[STRT DATE]) Between #2/1/2004# And #2/29/2004#))

GROUP BY [February04 (Subat)].[PAYR-ID]
             
ORDER BY [February04 (Subat)].[PAYR-ID]
;

Dan heb je alleen je datum niet meer in de lijst, en de naam ook niet.

Die kun je er eventueel bijhalen door (ACCESS was het toch?) van deze query een view te maken, en in een tweede query bij alle PAYR-ID/ACCNO records de ontbrekende gegevens bij te lezen. (Een left join tussen [deze query] en [February04 (Subat)] )

[ Voor 42% gewijzigd door Dido op 18-03-2005 13:45 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Kijk aan! Dit werkt! Mijn dank is groot.

Alleen.... nu zit ik nog met het probleem dat er ook PAYR-ID's tussen zitten, die al eerder een ACC NO hadden, en tussen x en y een tweede (of derde, vierde etc) aangemaakt hebben. Die wil ik er eigenlijk niet bij hebben.... Ik wil alleen totaal nieuwe klanten in februari 2004 zien.

Misschien nog een momentje tijd om hier naar te kijken?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:57

Dido

heforshe

Daarvoor wellicht toch een subquerietje erbij?
code:
1
2
WHERE ..............
AND PAYR_ID NOT IN (SELECT PAYR-ID FROM [Tabel] WHERE STRDAT < Begindatum)

Of iets dergelijks?

[ Voor 6% gewijzigd door Dido op 18-03-2005 14:45 ]

Wat betekent mijn avatar?

Pagina: 1