Hey mensen,
Ik ben al een hele poos bezig om een bepaade selectie te maken in een MS Access database en ik kan er maar niet uitkomen. Ik zal eerst even de entiteiten en attributen opschrijven voor ik verder ga:
Customer(CustomerID,Info)
MailValue(MailValueID,MailHeadItemID,Description)
MailCust(MailCustID,MailValueID,CustomerID)
Treatment(TreatmentID, CustomerID)
PreOp(PreOpID,TreatmentID,TreatmentControlTypeID)
Korte uitleg over de samenstelling van de tabellen en wat ik nou daadwerkelijk wil bereiken.
In de customer tabel worden alle gegevens van een klant bijgehouden, waaronder van belang voor mijn query een date field -> Info en uiteraard een uniek nummer CustomerID
De MailValue tabel is puur een koppel tabel met hierin een aantal mogelijkheden waaruit een klant kan kiezen, alle met een uniek nummer en een beschrijving. De mogelijkheden zijn ook nog ingedeeld in hoofdgroepen (MailHeadItemID).
In MailCust staan de keuzes die klanten gemaakt hebben uit de MailValues. Dus hier wordt een CustomerID gekoppelt aan een gekozen MailValueID.
In de treatment tabel staan klanten gekoppelt aan een eventuele behandeling en de klant krijgt in deze tabel een uniek behandelnummer.
PreOp is weer gekoppelt aan de treatment tabel, een klant kan meerdere keren gekoppelt zijn aan een preop omdat er verschillende mogelijkheden zijn (TreatmentControlTypeID)
Zo nu dat een beetje duidelijk is, wat probeer ik te bereiken.
Ik wil van elke mailvalue uit de groep mailheadvalueid = 7 een count hoevaak deze voorkomt in het klantenbestand met deze condities:
- de klant heeft een datum bij info van het jaar 2007
- de klant heeft een rij in preop met TreatmentControlTypeID = 1
Nu is dit opzich helemaal niet moeilijk met wat joins ben je er zo, echter het probleem waar ik tegenaan loop is dat niet alle mailvalue's ooit ingevuld zijn en voor diegene die nooit voorkomen wil ik ook een count van 0 hebben. En met gewone joins zal er nooit een rij in de resultaat query staan met die mailvalueid's en zal er dus ook geen count van 0 uitkoment.
Ik heb zelf al zitten denken aan een full outer join, alleen is dit niet mogelijk met ms access.
Dit is wat ik tot nu toe zelf heb:
Alle hulp of gedachtes over het oplossen van dit probleem zijn welkom! Trouwens de rede dat ik alle mailvalues erin wil hebben is omdat ik het resultaat automatisch in excel laat zetten en om te weten welke waardens bij welke description komen moet de lijst altijd even lang zijn.
Ik ben al een hele poos bezig om een bepaade selectie te maken in een MS Access database en ik kan er maar niet uitkomen. Ik zal eerst even de entiteiten en attributen opschrijven voor ik verder ga:
Customer(CustomerID,Info)
MailValue(MailValueID,MailHeadItemID,Description)
MailCust(MailCustID,MailValueID,CustomerID)
Treatment(TreatmentID, CustomerID)
PreOp(PreOpID,TreatmentID,TreatmentControlTypeID)
Korte uitleg over de samenstelling van de tabellen en wat ik nou daadwerkelijk wil bereiken.
In de customer tabel worden alle gegevens van een klant bijgehouden, waaronder van belang voor mijn query een date field -> Info en uiteraard een uniek nummer CustomerID
De MailValue tabel is puur een koppel tabel met hierin een aantal mogelijkheden waaruit een klant kan kiezen, alle met een uniek nummer en een beschrijving. De mogelijkheden zijn ook nog ingedeeld in hoofdgroepen (MailHeadItemID).
In MailCust staan de keuzes die klanten gemaakt hebben uit de MailValues. Dus hier wordt een CustomerID gekoppelt aan een gekozen MailValueID.
In de treatment tabel staan klanten gekoppelt aan een eventuele behandeling en de klant krijgt in deze tabel een uniek behandelnummer.
PreOp is weer gekoppelt aan de treatment tabel, een klant kan meerdere keren gekoppelt zijn aan een preop omdat er verschillende mogelijkheden zijn (TreatmentControlTypeID)
Zo nu dat een beetje duidelijk is, wat probeer ik te bereiken.
Ik wil van elke mailvalue uit de groep mailheadvalueid = 7 een count hoevaak deze voorkomt in het klantenbestand met deze condities:
- de klant heeft een datum bij info van het jaar 2007
- de klant heeft een rij in preop met TreatmentControlTypeID = 1
Nu is dit opzich helemaal niet moeilijk met wat joins ben je er zo, echter het probleem waar ik tegenaan loop is dat niet alle mailvalue's ooit ingevuld zijn en voor diegene die nooit voorkomen wil ik ook een count van 0 hebben. En met gewone joins zal er nooit een rij in de resultaat query staan met die mailvalueid's en zal er dus ook geen count van 0 uitkoment.
Ik heb zelf al zitten denken aan een full outer join, alleen is dit niet mogelijk met ms access.
Dit is wat ik tot nu toe zelf heb:
code:
1
2
3
4
5
6
7
| SELECT Description, count(LaserTreatmentControlType) FROM (SELECT * FROM (((SELECT MailValueID, Description FROM MailValue WHERE MailHeadItemId = 22) AS omschrijving LEFT JOIN (SELECT MailValueID, CustomerID FROM MailCust WHERE MailHeadItemId = 22) AS gevonden ON omschrijving.MailValueID = gevonden.MailValueID) LEFT JOIN (SELECT CustomerID, LaserTreatmentID FROM (SELECT * FROM LaserTreatment INNER JOIN (SELECT CustomerID FROM Customer WHERE LaserInfo IS NOT NULL AND YEAR(LaserInfo) = 2007) AS customer ON LaserTreatment.CustomerID = customer.CustomerID)) AS treatment ON gevonden.CustomerID = treatment.CustomerID) LEFT JOIN (SELECT DISTINCT LaserTreatmentID, LaserTreatmentControlTypeID FROM laserPreOp WHERE YEAR(RecDateTime) = 2007 AND LaserTreatmentControlTypeID = 10) AS preop ON treatment.LaserTreatmentID = preop.LaserTreatmentID); GROUP BY Description |
Alle hulp of gedachtes over het oplossen van dit probleem zijn welkom! Trouwens de rede dat ik alle mailvalues erin wil hebben is omdat ik het resultaat automatisch in excel laat zetten en om te weten welke waardens bij welke description komen moet de lijst altijd even lang zijn.