Kom niet uit deze query

Status
Niet open voor verdere reacties.

cslekniws

Nieuwe gebruiker
Lid geworden
6 mrt 2010
Berichten
4
Ik breek mijn hoofd op dit moment over een query die ik moet maken. Heb niet zo veel ervaring met handmatig SQL programmeren. Wel met Access e.d.
Het volgende vraagstuk houdt me bezig. Iemand een idee hoe je dit met SQL zou kunnen doen ;

Ik heb een tabel met klantcontracten (zo zal ik het maar noemen).
Nu zijn de belangrijkste velden hiervan:
Klantnr,
Financieringsnr.
ContractGeldigVanaf,
ContractGeldigtm

Nu moet ik het volgende voor elkaar krijgen. Zoek in deze tabel de klanten op die een contract hebben waarbij ze een overlap hebben in contractGeldigVanaf t/m contractGeldigtm en waarbij de financieringsnummers verschillend zijn.

B.v.
1. Klant A heeft Financieringsnr: 3 en een geldigheid van 1-1-2009 t/m 1-5-2009
2. Klant A heeft Financieringsnr: 5 en een geldheid van 1-3-2009 t/m 1-12-2009
3. Klant A heeft Financieringsnr : 3 en een geldigheid van 1-6-2009 t/m 1-1-2010

Nu gaat het mij erom om dan records te zoeken waarbij in dezelfde periode dezelfde klant meerdere contracten heeft met verschillende financieringsnummers.

In bovenstaande voorbeeld geldt dus dat dan regel 1 en 2 gevonden en getoond worden.

Ik heb al zitten puzzelen met innerjoins op dezelfde tabel, met de EXIST operator enz maar kom er niet uit. Kan iemand mij helpen ?

Groet Cees
 
Leuke. Er zijn 4 mogelijk vormen van overlap waar je op moet checken:

* Contract 1 valt geheel binnen Contract 2
* Contract 2 valt geheel binnen Contact 1
* Contract 1 begint voor Contract 2 begint, en loopt af voor Contract 2 afloopt.
* Contract 2 begint voor Contract 1 begint, en loopt af voor Contract 1 afloopt.

Dat betekend dat je 4 checks krijgt met een OR ertussen. Verder moet je nog een extra check erop gooien dat de nummers verschillend zijn, en dan een EXIST gebruiken om te kijken of er een rij is die aan de voorwaarden voldoet.

[sql]
SELECT info
FROM klant AS k
WHERE EXISTS (
SELECT 1
FROM klant AS k2
WHERE k.nummer != k2.nummer AND ( datum_vergelijking_1 OR datum_vergelijking_2 OR datum_vergelijking_3 OR datum_vergelijking_4 )
)
[/sql]

Datum vergelijkingen ben ik niet zo goed in want ik gebruik altijd timestamps dus dat moet je denk ik zelf even uitvogelen maar volgensmij is dit iig de richting waar je in moet zoeken.

Let op de haakjes, "A en B of C" is niet hetzelfde als "A en ( B of C )"
 
De oplossing van Frats is niet juist.
Probeer deze eens

Code:
SELECT k1.*
FROM klantcontracten AS k1
WHERE EXISTS
(
SELECT k2.*
FROM klantcontracten AS k2
WHERE k1.Financieringsnr <> k2.Financieringsnr
AND (k2.ContractGeldigVanaf BETWEEN k1.ContractGeldigVanaf AND k1.ContractGeldigtm
OR (2.ContractGeldigtmBETWEEN k1.ContractGeldigVanaf AND k1.ContractGeldigtm)
)

Tardis
 
Bedankt

Frats en Tardis: bedankt voor jullie input. Ik ga het morgen op mijn werk meteen uitproberen. Ik zal laten weten of het gelukt is.

Groet Cees
 
Een stukje verder

Ik ben al een stukje verder:

Select T1.*
FROM T1307 AS T1
Where EXISTS
(SELECT T2.* FROM T1307 as T2
Where T2.ndFinstroom <> T1.ndFinStroom and T1.ndFinstroom not in (1,100,999) and T2.ndFinstroom not in (1,100,999)
and T1.ndClient=T2.ndClient and (T2.ndGeldigVan between T1.ndGeldigVan and T1.ndGeldigTm
or T2.ndGeldigTm Between T1.ndGeldigVan and T1.ndGeldigTm)) and T1.ndGeldigtm > 39812

Order by T1.ndclient

Ik denk dat het me hiermee gaat lukken.
Ik plak de SQL in een Business Objects rapport waarna ik daar verder ga. Nogmaals dank.
 
Toch nog anders opgelost.

Ik heb mijn probleem uiteindelijk op een andere manier op weten te lossen.
Met de hand SQL invoeren kwam ik niet tot een oplossing. Ik ben daarna met SQL Enterprise manager aan de slag gegaan en een aantal query's gebouwd. Daarmee is het uiteindelijk gelukt.
Ik heb eerst twee views naar dezelfde tabel aangelegd en daar individuele selectiecriteria op toegepast. Toen heb ik een derde view gemaakt waar ik de beide views eerder aangemaakte views in geplaatst heb. Toen met een aantal innerjoins gewerkt en een aantal selectiestatements. De SQL van de verschillende views zal ik hieronder weergeven.

Allen nogmaals dank voor jullie meedenken:

Query 1:
________________

SELECT ndZorgOvereenkId, ndZorgVerantwId, ndClient, ndTypeIndicatie, ndIndFunctie1304, ndProdukt1304, ndVolgnrOvereenHis, ndKoppelingLevZO,
ndStartOvereenk, ndGeldigVan, ndGeldigTm, ndProdukt, ndDeskNiv, ndMinOvereenkWeek, ndExtramuraal, ndVerblijf, ndVolPakketThuis, ndFinStroom,
ndMwOvereenkomst, ndRdnEindeOvereenk, ndSituatieAfsluit, ndStatus, sdBijzOvereenkomst, sdBijzAfsluiten, ndBeoordeeld, ndMwBeoordeeld,
ndDatumBeoordeeld, sdBijzBeoordeling, ddStore, sdStore, ddUpdate, sdUpdate
FROM dbo.T1307
WHERE (NOT (ndFinStroom IN (1, 100, 999))) AND (ndGeldigTm > 39812)


Query 2:
____________
SELECT ndZorgOvereenkId, ndZorgVerantwId, ndClient, ndTypeIndicatie, ndIndFunctie1304, ndProdukt1304, ndVolgnrOvereenHis, ndKoppelingLevZO,
ndStartOvereenk, ndGeldigVan, ndGeldigTm, ndProdukt, ndDeskNiv, ndMinOvereenkWeek, ndExtramuraal, ndVerblijf, ndVolPakketThuis, ndFinStroom,
ndMwOvereenkomst, ndRdnEindeOvereenk, ndSituatieAfsluit, ndStatus, sdBijzOvereenkomst, sdBijzAfsluiten, ndBeoordeeld, ndMwBeoordeeld,
ndDatumBeoordeeld, sdBijzBeoordeling, ddStore, sdStore, ddUpdate, sdUpdate
FROM dbo.T1307
WHERE (NOT (ndFinStroom IN (1, 100, 999))) AND (ndGeldigTm > 39812)


Query 3:
________
SELECT DISTINCT
TOP 100 PERCENT dbo.ZZ_Afwijk_Fin_Sub1.ndZorgVerantwId, dbo.ZZ_Afwijk_Fin_Sub1.ndClient, dbo.ZZ_Afwijk_Fin_Sub1.ndFinStroom,
dbo.T1115.sdFinstroom, dbo.T1198.ddDag AS GeldigVan, T1198_1.ddDag AS GeldigTm, dbo.ZZ_Afwijk_Fin_Sub1.ndTypeIndicatie
FROM dbo.ZZ_Afwijk_Fin_Sub1 INNER JOIN
dbo.ZZ_Afwijk_Fin_Sub2 ON dbo.ZZ_Afwijk_Fin_Sub1.ndClient = dbo.ZZ_Afwijk_Fin_Sub2.ndClient AND
dbo.ZZ_Afwijk_Fin_Sub1.ndFinStroom <> dbo.ZZ_Afwijk_Fin_Sub2.ndFinStroom AND
dbo.ZZ_Afwijk_Fin_Sub1.ndZorgOvereenkId <> dbo.ZZ_Afwijk_Fin_Sub2.ndZorgOvereenkId INNER JOIN
dbo.T1115 ON dbo.ZZ_Afwijk_Fin_Sub1.ndFinStroom = dbo.T1115.ndFinstroom INNER JOIN
dbo.T1198 ON dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigVan = dbo.T1198.ndDag INNER JOIN
dbo.T1198 AS T1198_1 ON dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigTm = T1198_1.ndDag
WHERE (dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigVan BETWEEN dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigVan AND dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigTm) OR
(dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigTm BETWEEN dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigVan AND dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigTm) OR
(dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigVan BETWEEN dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigVan AND dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigTm) OR
(dbo.ZZ_Afwijk_Fin_Sub2.ndGeldigTm BETWEEN dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigVan AND dbo.ZZ_Afwijk_Fin_Sub1.ndGeldigTm)
ORDER BY dbo.ZZ_Afwijk_Fin_Sub1.ndClient
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan