Vous devrez créer une requête avec un sous-select
SELECT
X.EmployeeID,
X.d1 AS ClassDate_1, ec1.ClassHours AS ClassHours_1,
X.d2 AS ClassDate_2, ec2.ClassHours AS ClassHours_2
FROM
((SELECT e.EmployeeID, Min(e.ClassDate) AS d1, Max(e.ClassDate) AS d2
FROM employee_classes AS e
GROUP BY e.EmployeeID) AS X
INNER JOIN employee_classes AS ec1
ON X.EmployeeID = ec1.EmployeeID AND X.d1 = ec1.ClassDate
)
INNER JOIN employee_classes AS ec2
ON X.EmployeeID = ec2.EmployeeID AND X.d2 = ec2.ClassDate;
Sinon, vous pouvez stocker la sélection imbriquée comme une requête (appelons-le query1
):
SELECT e.EmployeeID, Min(e.ClassDate) AS d1, Max(e.ClassDate) AS d2
FROM employee_classes AS e
GROUP BY e.EmployeeID
puis de l'utiliser dans une seconde requête
SELECT
X.EmployeeID,
X.d1 AS ClassDate_1, ec1.ClassHours AS ClassHours_1,
X.d2 AS ClassDate_2, ec2.ClassHours AS ClassHours_2
FROM
(query1 AS X
INNER JOIN employee_classes AS ec1
ON X.EmployeeID = ec1.EmployeeID AND X.d1 = ec1.ClassDate
)
INNER JOIN employee_classes AS ec2
ON X.EmployeeID = ec2.EmployeeID AND X.d2 = ec2.ClassDate;
Il serait beaucoup plus facile si les heures ne sont pas affichés
SELECT e.EmployeeID, Min(e.ClassDate) AS ClassDate_1, Max(e.ClassDate) AS ClassDate_2
FROM employee_classes AS e
GROUP BY e.EmployeeID
En effet, il existe une solution plus simple, mais il suppose que la table est triée par EmployeeID
et ClassDate
. Cette hypothèse n'est pas sûre, car aucun ordre de tri naturel n'est garanti. Access peut "décider" de réorganiser les enregistrements d'une manière différente à tout moment.
SELECT
EmployeeID,
First(ClassDate) AS ClassDate_1, First(ClassHours) AS ClassHours_1,
Last(ClassDate) AS ClassDate_2, Last(ClassHours) AS ClassHours_2
FROM
employee_classes
GROUP BY
EmployeeID
ORDER BY
EmployeeID;
Ici encore un sous-select peut aider
SELECT
EmployeeID,
First(ClassDate) AS ClassDate_1, First(ClassHours) AS ClassHours_1,
Last(ClassDate) AS ClassDate_2, Last(ClassHours) AS ClassHours_2
FROM
(SELECT * FROM employee_classes ORDER BY EmployeeID, ClassDate)
GROUP BY
EmployeeID
ORDER BY
EmployeeID;
Quelle qu'en soit, soit une sous-requête ou une deuxième requête est nécessaire.
Je ne ferais pas une table qui ressemble à ça - elle viole la première règle de la normalisation de la base de données. Vous pouvez conserver une table d'employés et une table de classes et écrire une requête qui vous donne les résultats souhaités. – maneesha
Bonjour maneesha. C'est ce que je voudrais faire.Conservez la table d'origine en l'état, mais créez une requête qui déplace les champs communs à l'ID employé vers la même ligne. Je ne sais pas comment écrire la requête pour obtenir ce résultat. – ultraviolet