我是一名新的ASP.NET开发人员,现在我正在开发一个Web应用程序,作为公司的培训管理系统。我现在正在开发一个仪表板的最后一个任务,该仪表板显示两个显示以下内容的图表:
图表显示了每个部门有多少员工参加了三种必修课程的统计数据。
另一张图表显示每个月每周培训公司的整体百分比
我知道如何使用ASP.NET图表控件,我已经开发了两个与这两个剩余图表不同的图表。
我现在的问题是SQLServer Query需要获取这两个图表的结果。
我的数据库设计如下:
Courses Table consists of: CourseName, CourseID, GroupID
Groups Table consists of: ID, GroupName
Employee Table consists of: Name, SSN, Department
Employee_Course Table consists of: employeeId, courseId
我提出了以下复杂的查询,但需要更多补充。
SELECT TOP (100) PERCENT dbo.employee.Department, dbo.employee.Name, T1.SSN
, courses_2.CourseName
, CASE
WHEN dbo.employee_courses.courseId IS NULL THEN ' '
ELSE 'Yes'
END AS CourseId
FROM dbo.employee_courses
RIGHT OUTER JOIN dbo.courses AS courses_2
INNER JOIN
(
SELECT employee_1.SSN, courses_1.CourseID
FROM dbo.employee AS employee_1
CROSS JOIN dbo.courses AS courses_1
) AS T1 ON courses_2.CourseID = T1.CourseID
INNER JOIN dbo.employee ON T1.SSN = dbo.employee.SSN
ON dbo.employee_courses.employeeId = T1.SSN
AND dbo.employee_courses.courseId = T1.CourseID
ORDER BY T1.SSN
我不知道如何使其适用于显示上述要求。
为了澄清这个问题,我们假设我们有两种类型/组的课程;强制性和可选性。另外,我们有部门; A,B和C.假设我们有以下数量的员工完成了每个部门的必修课程: A部门:105名员工中的55名, B部门:114名员工中有78名, 和C部门:147名员工中的98名
我想要这样一个查询,它给出了完成所需课程的员工百分比,以及每个部门的可选课程。因此,我可以开发一个图表,显示每个部门的两列(或两个系列),并显示每个部门的培训百分比
答案 0 :(得分:1)
根据我的理解,下面的查询会返回您要查找的信息。 key子句在T-SQL中使用EXCEPT语句。 EXCEPT将返回第一个查询中未包含在第二个查询中的所有行。我们可以在此处使用它来确定尚未完成所有必修课程或所有选修课程的员工。为清晰起见,我使用了常用表表达式,但您也可以将CTE用作子查询。
;with EmployeesWithRequiredCourses as
(
select *
from Employee
where not exists
(
select CourseID
from Courses
inner join GroupTable on GroupTable.GroupID = Courses.GroupID
where GroupTable.GroupName = 'Required'
except
select Employee_Course.CourseID
from Employee_Course
inner join Courses on Courses.CourseID = Employee_Course.CourseID
inner join GroupTable on GroupTable.GroupID = Courses.GroupID
where Employee_Course.EmployeeID = Employee.EmployeeID
and GroupTable.GroupName = 'Required'
)
),
EmployeesWithOptionalCourses as
(
select *
from Employee
where not exists
(
select CourseID
from Courses
inner join GroupTable on GroupTable.GroupID = Courses.GroupID
where GroupTable.GroupName = 'Optional'
except
select Employee_Course.CourseID
from Employee_Course
inner join Courses on Courses.CourseID = Employee_Course.CourseID
inner join GroupTable on GroupTable.GroupID = Courses.GroupID
where Employee_Course.EmployeeID = Employee.EmployeeID
and GroupTable.GroupName = 'Optional'
)
)
select Employee.Department,
COUNT(EmployeesWithRequiredCourses.EmployeeID) as RequiredCourseCount,
COUNT(EmployeesWithOptionalCourses.EmployeeID) as OptionalCourseCount,
COUNT(Employee.EmployeeID) as EmployeeCount,
CAST(COUNT(EmployeesWithRequiredCourses.EmployeeID) as real)/CAST(COUNT(Employee.EmployeeID) as real) as RequiredCoursePercentage,
CAST(COUNT(EmployeesWithOptionalCourses.EmployeeID) as real)/CAST(COUNT(Employee.EmployeeID) as real) as OptionalCoursePercentage
from Employee
left outer join EmployeesWithRequiredCourses on EmployeesWithRequiredCourses.EmployeeID = Employee.EmployeeID
left outer join EmployeesWithOptionalCourses on EmployeesWithOptionalCourses.EmployeeID = Employee.EmployeeID
group by Employee.Department
然而,根据您在下面的评论,我写了一个新的查询,其中列出了每个部门和coursename,完成该课程的员工数量,部门中的员工总数以及部门中员工的百分比已完成课程。和以前一样,我正在使用公用表表达式,但您可以轻松地将其转换为使用子查询。
;with Departments as
(
select Department, COUNT(*) as DepartmentEmployeeCount
from Employee
group by Department
),
DepartmentCourse as
(
select Department, CourseName, DepartmentEmployeeCount
from Departments
cross join Courses
),
CompletedCourses as
(
select Department, CourseName, COUNT(*) as CourseCompletedCount
from Employee
inner join Employee_Course on Employee_Course.EmployeeID = Employee.EmployeeID
inner join Courses on Courses.CourseID = Employee_Course.CourseID
group by Department, CourseName
)
select DepartmentCourse.Department,
DepartmentCourse.CourseName,
CourseCompletedCount,
DepartmentEmployeeCount,
CAST(ISNULL(CourseCompletedCount,0) as real)/CAST(DepartmentEmployeeCount as real) as CourseCompletionPercentage
from DepartmentCourse
left outer join CompletedCourses on CompletedCourses.Department = DepartmentCourse.Department and CompletedCourses.CourseName = DepartmentCourse.CourseName
我还包括用于设置一些测试数据的SQL,以便您可以看到我可能做出的与您自己的数据库不匹配的假设。
create table GroupTable
(
GroupID int not null,
GroupName varchar(50)
)
create table Courses
(
CourseID int not null,
GroupID int,
CourseName varchar(50)
)
create table Employee
(
EmployeeID int not null,
Name varchar(50),
SSN varchar(11),
Department varchar(50)
)
create table Employee_Course
(
EmployeeID int not null,
CourseID int not null
)
insert into GroupTable values (1, 'Required')
insert into GroupTable values (2, 'Optional')
insert into Courses values (1, 1, 'Course1')
insert into Courses values (2, 1, 'Course2')
insert into Courses values (3, 1, 'Course3')
insert into Courses values (4, 2, 'Course4')
insert into Courses values (5, 2, 'Course5')
insert into Courses values (6, 2, 'Course6')
insert into Employee values (1, 'Bob','122-45-1111', 'A')
insert into Employee values (2, 'Peter','124-45-2222', 'A')
insert into Employee values (3, 'Joe','125-45-3333', 'A')
insert into Employee values (4, 'Jimmy','126-45-4444', 'A')
insert into Employee values (5, 'Mary','127-45-5555', 'A')
insert into Employee values (6, 'Alice','122-45-6666', 'B')
insert into Employee values (7, 'Jennifer','124-45-7777', 'B')
insert into Employee values (8, 'Carter','125-45-8888', 'B')
insert into Employee values (9, 'Mason','126-45-9999', 'C')
insert into Employee values (10, 'Irina','127-45-0000', 'C')
insert into Employee_Course values (1,1)
insert into Employee_Course values (1,2)
insert into Employee_Course values (1,3)
insert into Employee_Course values (1,4)
insert into Employee_Course values (1,5)
insert into Employee_Course values (1,6)
insert into Employee_Course values (2,1)
insert into Employee_Course values (2,2)
insert into Employee_Course values (2,4)
insert into Employee_Course values (2,5)
insert into Employee_Course values (3,1)
insert into Employee_Course values (3,4)
insert into Employee_Course values (4,1)
insert into Employee_Course values (4,2)
insert into Employee_Course values (4,3)
insert into Employee_Course values (5,4)
insert into Employee_Course values (5,5)
insert into Employee_Course values (5,6)
insert into Employee_Course values (6,1)
insert into Employee_Course values (6,2)
insert into Employee_Course values (6,3)
insert into Employee_Course values (6,4)
insert into Employee_Course values (6,5)
insert into Employee_Course values (7,4)
insert into Employee_Course values (8,1)
insert into Employee_Course values (9,2)
insert into Employee_Course values (9,3)
insert into Employee_Course values (9,4)
insert into Employee_Course values (9,5)
insert into Employee_Course values (9,6)
insert into Employee_Course values (10,1)
insert into Employee_Course values (10,2)
insert into Employee_Course values (10,3)
insert into Employee_Course values (10,4)
insert into Employee_Course values (10,5)
insert into Employee_Course values (10,6)
答案 1 :(得分:0)
听起来你需要做一些聚合。
这样的事情应该能够计算出按部门选择特定课程的员工人数
SELECT COUNT(*), CourseID, Department
FROM Courses c
INNER JOIN Employee_Course ec ON c.CourseID = ec.CourseID
INNER JOIN Employee e ON ec.EmployeeID = e.EmployeeID
HAVING CourseID IN (requiredCourseIDs)
GROUP BY CourseID, GroupID
这是在正确的轨道上吗?