如何添加 SQL 表中某个值的出现次数特定于表中的另一个值

问题描述 投票:0回答:1

我已经搜索并认为我已经找到了部分答案,但我仍然不太明白。我有一个包含 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
sql sql-server
1个回答
1
投票

切勿

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
进行比较,因此无需加入休假类型表。

© www.soinside.com 2019 - 2024. All rights reserved.