我想知道是否有人可以帮助我提出请求:
以下是数据:
表1:EMPLOYEE
FK: DID
PK: Name
UserName
表2:DEPARTMENT
PK: DID
TerminationDate
我希望找到本季度终止员工的数量。到目前为止,这是T-SQL:
SELECT
DEPARTMENT.name AS Name,
COUNT(e.userName)
FROM
EMPLOYEE AS e
JOIN
DEPARTMENT ON e.department = DEPARTMENT.DID
UNION
SELECT
u.eu, u.name
FROM
(SELECT
dd.name, COUNT(ee.userName) AS eu
FROM
DEPARTMENT AS dd
JOIN
EMPLOYEE AS ee ON dd.DID = ee.department
AND ee.terminationDate IS NOT NULL
WHERE
ee.terminationDate IS NOT NULL
AND ee.terminationDate BETWEEN '2015-04-01' AND '2015-06-30'
GROUP BY
dd.name, ee.userName) AS u
GROUP BY
u.eu, u.name, Name
ORDER BY
Name
错误是:
Msg 8120,Level 16,State 1,Line 1
列'DEPARTMENT.name'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。
答案 0 :(得分:0)
在查询的第一部分中,您在select子句中列出部门名称,但不要将其包含在group by子句中(因为它缺少)
select DEPARTMENT.name as Name, COUNT(e.userName)
from EMPLOYEE as e
join DEPARTMENT on e.department = DEPARTMENT.DID
group by DEPARTMENT.Name --add this line
答案 1 :(得分:0)
此查询的问题数量令人困惑。首先...您列出的表定义与您的查询不匹配。您有TerminationDate
作为DEPARTMENT
表的一个属性,在查询中,您看起来像是通过EMPLOYEE
表访问它,这在那里是有意义的。所以我假设您的表结构确实是:
表1:员工
FK: DID
PK: Name
UserName
TerminationDate
表2:部门
PK: DID
Name
在此查询中使用UNION
的方式让我相信您对UNION
语句的作用有误解。 UNION
用于将两个集合合并为一个集合。所以在集理论{1,2,3}中,{{4,4}}是{1,2,3,3,4}。在SQL Server中,您必须确保第一个select语句中的类型和列数与所有与其联合的选择匹配。例如:
Select 1 A, 2 B
Union
Select 3 B
会出现此错误,因为第一个选择有两列而第二个只有一列:
Msg 205,Level 16,State 1,Line 3所有查询都使用UNION组合, INTERSECT或EXCEPT运算符必须具有相同数量的表达式 在他们的目标列表中。
这个查询:
Select 1 A
Union
Select 'Bob' A
由于列类型不匹配,会出现此错误:
消息245,级别16,状态1,行2转换时转换失败 varchar值' Bob'数据类型int。
如果你要找的是两个日期之间终止的员工人数,那么你真的没有什么可以结合的。所有员工已经在一起(Employee
表)......你只需要过滤你想要的日期并计算记录总数。你甚至不需要DEPARTMENT
表来计算它。
我可以为你写这个问题......但我会把剩下的留给你。