如何连接两个sql语句
我有两个查询返回正确的结果。其中之一是:如何连接两个sql语句,sql,sql-server,join,Sql,Sql Server,Join,我有两个查询返回正确的结果。其中之一是: select distinct epr.DepartmentCode from [dbo].[EmployeePayRates] epr join [dbo].[EmployeeTimecards] et on epr.EmployeeID = et.EmployeeID where StoreID = 89 它检查所有在商店登记的不同部门员工。查询返回: DepartmentCode 1 2 5 第二个问题是: SELECT DISTINCT
select distinct epr.DepartmentCode
from [dbo].[EmployeePayRates] epr
join [dbo].[EmployeeTimecards] et on epr.EmployeeID = et.EmployeeID
where StoreID = 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
如果有人告诉我如何加入这些查询,我将不胜感激。
提前感谢。您可以将第一个查询移动到子查询中,然后将
左键联接
返回到表中,并执行相同的计数:
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
也可能被误解为yyy-dd-MM
。虽然这篇文章的重点并不是在他的文章中讨论这个格式问题,但我选择使用一个公共表表达式来连接这两个查询。在我的博客上查看我的CTE文章-
我认为这是行不通的,因为从你的
部门代码开始,CTE排除了没有任何与之相关联的employeepayrates结果。“也许你根本不需要那个CTE?@Sebas为什么不?CTE中的查询与问题中的第一个查询完全相同,该查询返回所需的3个部门代码,并且我只将左连接
返回到员工时间卡
,因此没有理由不将所有3行包含在最终结果中。不过,您是对的,不需要CTE,在我的更新中,我给出了一个只有一个连接的解决方案。@GarethD第二个连接输出了错误的数据。但第一个是一种魅力!非常感谢。是的,员工的时间卡日期只是有限的。@DzmitrySevkovich很高兴我能帮上忙。我刚刚从答案中删除了第二个问题,因为它是错误的。
--
-- 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