Sql CTE中的对象名称无效
我在下面的查询中尝试了CTE合并两个表,并得到了无效的对象错误,但它存在。有人能指导我吗Sql CTE中的对象名称无效,sql,sql-server,Sql,Sql Server,我在下面的查询中尝试了CTE合并两个表,并得到了无效的对象错误,但它存在。有人能指导我吗 ;WITH t1 AS ( SELECT DepId , COUNT(EmpId) AS TotalHeadCount FROM Emploee WHERE (datepart(yyyy, DOJ) BETWEEN 2005 AND 2017) AND STATUS = 0 GROUP BY DepId ) , t2 AS
;WITH t1
AS (
SELECT DepId
, COUNT(EmpId) AS TotalHeadCount
FROM Emploee
WHERE (datepart(yyyy, DOJ) BETWEEN 2005 AND 2017)
AND STATUS = 0
GROUP BY DepId
)
, t2
AS (
SELECT DepId
, COUNT(EmpId) AS NewJoinees
FROM Emploee
WHERE (DATEPART(yyyy, DOJ) = 2017)
AND (DATEPART(mm, DOJ) = 01)
AND datepart(mm, DOJ) >= 12
AND STATUS = 0
GROUP BY DepId
)
, t3
AS (
SELECT Tobehired AS TOBEHIRED
, OpenPosition AS OPENPOSITION
, STATUS
FROM Employee1
)
SELECT t1.DepId
, CASE
WHEN TotalHeadCount IS NULL
THEN '0'
ELSE TotalHeadCount
END AS TotalHeadCount
, CASE
WHEN NewJoinees IS NULL
THEN '0'
ELSE NewJoinees
END AS NewJoinees
, Tobehired
, OpenPosition
, STATUS
FROM t1
FULL JOIN t2
ON t1.DepId = t2.DepId
FULL JOIN t3
ON t1.DepId = t3.DepId
通用表表达式有一定的使用时间和地点。我不认为这是其中之一。。。通过嵌套子查询、递归和重构实现复杂连接,以实现可维护性。在我看来,两张桌子的连接似乎不符合要求
SELECT E.DEPID
, sum(case when datepart(yyyy,E.doj) between 2005 and 2017 and status =0 then 1 else 0 end as TotalHeadCount
, sum(case when E.doj >= cast('2017-01-12' as datetime) then 1 else 0 end as NewJoinees
, E1.Tobehired
, E1.OpenPosition
, E1.STATUS
FROM Employee E
LEFT JOIN Emplyee1 E1
on E.DepID = E1.DepID
GROUP BY E.DEPID,
, E1.Tobehired
, E1.OpenPosition
, E1.STATUS
请不要使用不适用于您的问题的标记。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请仅添加您实际使用的数据库的标记我在您的
T3
CTE中没有看到名为DepID
的字段,但您正在尝试加入该字段。您正在选择的表是否实际称为employee
和employee1
?每个CTE定义中的每个SELECT语句是否都独立运行而没有错误?发布问题时最好包含整个错误消息。根据函数datepart
以及MS Access中不提供CTE(使用datepart()的唯一其他数据库)这一事实,在问题中添加了sql server标记您好,感谢您的回复,在上面的查询中,行E对象的总和丢失,尽管添加了我得到的错误