我已经搜索并认为我已经找到了部分答案,但我仍然不太明白。我有一个包含 4 个表的数据库,我试图返回每个员工的姓名、他们的总假期天数(基于他们的职称)以及他们休假的天数(通过相加得出)该员工的休假表的 ReasonID 列等于 2 的所有实例。
这就是我所拥有的,如果我取出尝试获取 VacationDaysTaken 的行,我可以返回正确的 EmployeeName 和 TotalVactionDays。如果我只是尝试返回 VacationDaysTaken,那么我会得到所有员工使用的假期天数。如果我尝试按照下面列出的方式运行它,我会得到“列 'Employee.Last' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。”
SELECT
Employee.Last + ', ' + Employee.First AS EmployeeName,
Title.Vacation AS TotalVacationDays,
SUM(CASE WHEN Leave.ReasonID=2 THEN 1 ELSE 0 END) AS VacationDaysTaken
FROM Employee, Title, Leave, LeaveType
WHERE Employee.EmpID = Leave.EmpID
AND Leave.ReasonID = LeaveType.ReasonID
AND Employee.TitleID = Title.TitleID
ORDER BY EmployeeName
切勿在
FROM
子句中使用逗号。 始终使用正确、明确的JOIN
语法。
你需要一个
GROUP BY
:
SELECT e.Last + ', ' + e.First AS EmployeeName,
t.Vacation AS TotalVacationDays,
SUM(CASE WHEN l.ReasonID = 2 THEN 1 ELSE 0 END) AS VacationDaysTaken
FROM Employee e JOIN
Title t
ON e.TitleID = t.TitleID JOIN
Leave l
ON e.EmpID = l.EmpID
GROUP BY e.Last, e.First, t.Vacation
ORDER BY EmployeeName;
注意:由于您使用
ReasonId
进行比较,因此无需加入休假类型表。