如何显示公司各部门的培训统计数据?

时间:2011-11-13 23:13:26

标签: c# asp.net sql sql-server asp.net-charts

我是一名新的ASP.NET开发人员,现在我正在开发一个Web应用程序,作为公司的培训管理系统。我现在正在开发一个仪表板的最后一个任务,该仪表板显示两个显示以下内容的图表:

  1. 图表显示了每个部门有多少员工参加了三种必修课程的统计数据。

  2. 另一张图表显示每个月每周培训公司的整体百分比

  3. 我知道如何使用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名

    我想要这样一个查询,它给出了完成所需课程的员工百分比,以及每个部门的可选课程。因此,我可以开发一个图表,显示每个部门的两列(或两个系列),并显示每个部门的培训百分比

2 个答案:

答案 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

这是在正确的轨道上吗?