Ik heb een grote Excel database geïmporteerd in Access om hier queries op te kunnen doen.
De relevante kolommen van de tabel zien er zo uit:
Nou wil ik vanuit deze Excel/Access database een Mailmerge voorbereiden. De mailmerge hanteert de volgende logica:Mensen die een hasResume = 0 hebben krijgen een e-mail. In deze e-mail word verwezen naar drie collega's die hasResume = 1 hebben. Het liefste wil ik verwijzen naar collega's met dezelfde functie (title) binnen hetzelfde department omdat mensen hier het meeste affiniteit mee hebben. Mochten er geen drie van deze identieke collega's bestaan dan in ieder geval binnen dezelfde department (hier zijn er altijd genoeg van).
Dus eigenlijk wil ik een conditionele SQL query met een volgende Where clause:
IF Title = Title AND Department = Department ELSE Department = Department
Uiteindelijk wil ik een lijstje krijgen als dit:
De naam is degene die zijn hasResume = 0 heeft en Collega1,2,3 hebben een hasResume = 1 en matchen zoveel mogelijk met naam (Pietje). Het is een vrij grote set, dus handmatig is niet echt een optie
Ik heb verschillende zaken geprobeerd (Queries, Joins, Subqueries) maar ik kom er niet uit. Mijn laatste idee was het volgende. In een Subquery SimilarPeople loop je alle paren van mensen langs. Vervolgens sorteer je deze paren op similariteit (1 = matchende Title EN Department; 0 is alleen een department). Hieronder staat de query. Helaas gaat de ordering van de subquery verloren..
De hoofdquery was deze:
Een alternatief wat ik heb is alles in één query:
Nadeel van deze query is dat ik geen GROUP BY kan gebruiken en je dus gigantisch veel entries terug krijgt. Wel bovenaan bij elke username de "beste" optie.
Weet iemand hoe ik wel mijn gewenste overzicht kan krijgen? Welke queries moet ik hiervoor uitvoeren? Het mag een dure query zien aangezien hij maar 1x uitgevoerd hoeft te worden.
De relevante kolommen van de tabel zien er zo uit:
Username | Name | Title | Department | hasResume |
NL\pietje | Puk, Pietje | Manager | HockeySticks | 0 |
NL\jjip | Jip, Janneke | Jurist | Rechten | 1 |
Nou wil ik vanuit deze Excel/Access database een Mailmerge voorbereiden. De mailmerge hanteert de volgende logica:Mensen die een hasResume = 0 hebben krijgen een e-mail. In deze e-mail word verwezen naar drie collega's die hasResume = 1 hebben. Het liefste wil ik verwijzen naar collega's met dezelfde functie (title) binnen hetzelfde department omdat mensen hier het meeste affiniteit mee hebben. Mochten er geen drie van deze identieke collega's bestaan dan in ieder geval binnen dezelfde department (hier zijn er altijd genoeg van).
Dus eigenlijk wil ik een conditionele SQL query met een volgende Where clause:
IF Title = Title AND Department = Department ELSE Department = Department
Uiteindelijk wil ik een lijstje krijgen als dit:
Naam | Collega1 | Collega2 | Collega3 |
Pietje | Jip | Jan | Jul |
De naam is degene die zijn hasResume = 0 heeft en Collega1,2,3 hebben een hasResume = 1 en matchen zoveel mogelijk met naam (Pietje). Het is een vrij grote set, dus handmatig is niet echt een optie
Ik heb verschillende zaken geprobeerd (Queries, Joins, Subqueries) maar ik kom er niet uit. Mijn laatste idee was het volgende. In een Subquery SimilarPeople loop je alle paren van mensen langs. Vervolgens sorteer je deze paren op similariteit (1 = matchende Title EN Department; 0 is alleen een department). Hieronder staat de query. Helaas gaat de ordering van de subquery verloren..
SQL:
1
2
3
4
| SELECT [1].Name AS Name1, [2].Name AS Name2, (IIf([1].Title=[2].Title,1,0)) AS Expr1, [1].UserName AS UserName FROM [MasterTable - 29Nov] AS 1, [MasterTable - 29Nov] AS 2 WHERE ((([1].Department)=[2].Department) And (([1].hasResume)=0) And (([2].hasResume)=1)) ORDER BY [1].Name, (IIf([1].Title=[2].Title,1,0)) DESC; |
De hoofdquery was deze:
SQL:
1
2
3
4
5
6
| SELECT sp1.UserName, First(sp1.Name1) AS FirstOfName1, First(sp1.Name2) AS FirstOfName2, First(sp2.Name2) AS FirstOfName21, First(sp3.Name2) AS FirstOfName22 FROM [SimilarPeople] AS sp1, [SimilarPeople] AS sp2, [SimilarPeople] AS sp3 WHERE (((sp1.Name2)<>sp2.Name2 And (sp1.Name2)<>sp3.Name2) And ((sp2.Name2)<>sp3.Name2) AND ((sp1.UserName)=sp2.UserName) AND ((sp2.UserName)=sp3.UserName)) GROUP BY sp1.Username ORDER BY sp1.UserName; |
Een alternatief wat ik heb is alles in één query:
SQL:
1
2
3
4
| SELECT [1].UserName, [2].Name AS person1, [3].Name AS person2, [4].Name AS person3, (IIf([2].Title=[1].Title,1,0)) AS SameTitle2, (IIf([3].Title=[1].Title,1,0)) AS Expr1, (IIf([4].Title=[1].Title,1,0)) AS Expr2 FROM [MasterTable - 29Nov] AS 1, [MasterTable - 29Nov] AS 2, [MasterTable - 29Nov] AS 3, [MasterTable - 29Nov] AS 4 WHERE ((([1].hasResume)=0) AND (([2].hasResume)=1) AND (([1].Department)=[2].[Department]) AND (([3].hasResume)=1) AND (([2].Username)<>[3].[Username]) AND (([3].Department)=[1].[Department]) AND (([4].hasResume)=1) AND (([4].Username)<>[3].[Username] And ([4].Username)<>[2].[Username]) AND (([4].Department)=[1].[Department])) ORDER BY [1].Username, (IIf([2].Title=[1].Title,1,0)) DESC , (IIf([3].Title=[1].Title,1,0)) DESC , (IIf([4].Title=[1].Title,1,0)) DESC; |
Nadeel van deze query is dat ik geen GROUP BY kan gebruiken en je dus gigantisch veel entries terug krijgt. Wel bovenaan bij elke username de "beste" optie.
Weet iemand hoe ik wel mijn gewenste overzicht kan krijgen? Welke queries moet ik hiervoor uitvoeren? Het mag een dure query zien aangezien hij maar 1x uitgevoerd hoeft te worden.
[ Voor 14% gewijzigd door GandalfTheGrey op 08-12-2010 14:28 ]