2013-11-25 58 views
2

我有两个查询返回正确的结果。其中之一是:如何加入两条sql语句

select distinct epr.DepartmentCode 
from [dbo].[EmployeePayRates] epr 
join [dbo].[EmployeeTimecards] et on epr.EmployeeID = et.EmployeeID 
where StoreID = 89 

它检查所有在店里89.查询返回检查过在不同部门的员工:

DepartmentCode 
1 
2 
5 

第二个查询:

SELECT DISTINCT 
    DepartmentCode, count(DISTINCT EmployeeID) 
FROM [dbo].[EmployeeTimecards] 
WHERE EmployeeTimecardDate = '2013-11-25' 
    AND StoreID = 89 
GROUP BY 
    DepartmentCode 

它返回现在每个部门的员工人数为89人。表看起来像:

DepartmentCode   EmployeeCount 
1      17 
5      7 

而且我想使它看起来像:

DepartmentCode   EmployeeCount 
1      17 
2      0 
5      7 

我会很感激,如果有人会告诉我如何加入这些查询。 在此先感谢。

回答

3

您可以将您的第一个查询到一个子查询,然后LEFT JOIN回你的表,并执行相同的计数:

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; 

顺便说一句,我改变你的字符串字面日至文化不变的格式yyyyMMdd因为即使ISO标准yyyy-MM-dd在某些地区可能会被误解为yyyy-dd-MM。虽然不是文章Aaron Bertrand的主要内容涵盖了他的文章中的格式问题mis-handling date/range queries

+0

我认为这将不起作用,因为以您的'DepartmentCodes'开始,CTE排除雇员结果没有任何员工卡关联的结果。也许你甚至不需要CTE? – Sebas

+0

@Sebas为什么不呢? CTE中的查询与返回所需3个部门代码的问题中的第一个查询完全相同,而我仅将'LEFT JOIN'返回到'EmployeeTimecards',因此没有理由不包含所有3行在最后的结果。然而,你是对的,CTE不是必需的,在我的更新中,我给出了只有一个连接的解决方案。 – GarethD

+0

@GarethD第二个输出错误的数据。但第一个作为魅力!谢谢! –

0

我选择使用公用表表达式来加入这两个查询。查看我的博客上的CTE文章 - 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