Comment joindre deux instructions sql

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