J'ai deux requêtes qui renvoient des résultats corrects. L'un d'eux est:
select distinct epr.DepartmentCode from [dbo].[EmployeePayRates] epr join [dbo].[EmployeeTimecards] et on epr.EmployeeID = et.EmployeeID where StoreID = 89
Il vérifie tous les employés des services distincts enregistrés dans le magasin.
DepartmentCode 1 2 5
La deuxième requête est:
SELECT DISTINCT DepartmentCode, count(DISTINCT EmployeeID) FROM [dbo].[EmployeeTimecards] WHERE EmployeeTimecardDate = '2013-11-25' AND StoreID = 89 GROUP BY DepartmentCode
Il returnne le nombre d'employés dans chaque département aujourd'hui au magasin 89. La table ressemble à:
DepartmentCode EmployeeCount 1 17 5 7
Et j'essaie de le faire ressembler à:
DepartmentCode EmployeeCount 1 17 2 0 5 7
J'apprécierai vraiment si quelqu'un me montrera comment joindre ces questions. Merci d'avance.
Vous pouvez déplacer votre première requête dans une sous-requête, puis LEFT JOIN
vers votre table et effectuer le même nombre:
WITH DepartmentCodes AS ( SELECT DISTINCT epr.DepartmentCode FROM [dbo].[EmployeePayRates] epr JOIN [dbo].[EmployeeTimecards] et ON epr.EmployeeID = et.EmployeeID WHERE StoreID = 89 ) SELECT dc.DepartmentCode, EmployeeCount = COUNT(DISTINCT c.EmployeeID) FROM DepartmentCodes dc LEFT JOIN [dbo].[EmployeeTimecards] c ON dc.DepartmentCode = c.DepartmentCode AND EmployeeTimecardDate = '20131125' AND StoreID = 89 GROUP BY dc.DepartmentCode;
En passant, j'ai changé votre date littérale de string au format invariant de culture yyyyMMdd
parce que même la norme ISO yyyy-MM-dd
peut être mal interprétée comme yyyy-dd-MM
dans certaines régions. Bien que n'étant pas le point principal de l'article Aaron Bertrand couvre ce problème de formatting dans son article de gestion des requêtes de date / intervalle
Je choisis d'utiliser une expression Common Table pour joindre les deux requêtes. Consultez mon article CTE sur mon blog – http://craftydba.com/?p=1234 .
-- -- Join cteDeptCode 2 cteEmpPerDept -- ; with cteDeptCode (DeptCode) as ( select distinct epr.DepartmentCode from [dbo].[EmployeePayRates] epr join [dbo].[EmployeeTimecards] et on epr.EmployeeID = et.EmployeeID where StoreID = 89 ), cteEmpPerDept(DeptCode, EmpCnt) as ( SELECT DISTINCT DepartmentCode, count(DISTINCT EmployeeID) FROM [dbo].[EmployeeTimecards] WHERE EmployeeTimecardDate = '2013-11-25' AND StoreID = 89 GROUP BY DepartmentCode ) select d.DeptCode, a.EmpCnt from cteDeptCode d left join cteEmpPerDept e on d.DeptCode = e.DeptCode