Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何连接两个sql语句_Sql_Sql Server_Join - Fatal编程技术网

如何连接两个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