Я занимаюсь разработкой веб-приложения для своей компании. Это приложение предоставляет пользователям викторины. Теперь мне нужно разработать мощную и значимую панель управления для руководства. На панели инструментов должно отображаться% участия = (сумма всех опросов, проведенных каждым сотрудником) / (общее количество сотрудников * общее количество опросов)
Вопрос: у меня следующий дизайн базы данных:
Таблица сотрудников: Имя пользователя, Имя, Работа, DivisionID
Таблица подразделений: DivisionID, DivisionName
Таблица тестов: QuizID, Название, Описание
Таблица UserQuiz: UserQuizID, Score, DateTimeComplete, QuizID, Имя пользователя
ПРИМЕЧАНИЕ. Первым атрибутом в каждой таблице является первичный ключ.
SQL-запрос, который я использую (но я не уверен в этом), чтобы показать процент выполнения:
DECLARE @LastDayOfPrevMonth DATETIME, @FirstDayOfThreeMonthsBefore DATETIME
SET @FirstDayOfThreeMonthsBefore = DATEADD(MONTH, -2, DATEADD(MONTH, DATEDIFF(MONTH, 0, CURRENT_TIMESTAMP), 0))
SET @LastDayOfPrevMonth = GETDATE()
;WITH MonthCTE AS
(
SELECT DATENAME(MONTH, DATEADD(MONTH, -2, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, -2, CURRENT_TIMESTAMP)) AS MonthYear
UNION ALL
SELECT DATENAME(MONTH, DATEADD(MONTH, -1, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, -1, CURRENT_TIMESTAMP))
UNION ALL
SELECT DATENAME(MONTH, DATEADD(MONTH, 0, CURRENT_TIMESTAMP)) + '-' + DATENAME(YEAR, DATEADD(MONTH, 0, CURRENT_TIMESTAMP))
)
SELECT Divisions.DivisionName
, [Percentage Participation] = CAST([Total Number of Quizzes Taken]
* 100.00 / [Total Number of Quizzes] AS DECIMAL(18, 2))
, [Total Number of Quizzes Taken]
, [Total Number of Quizzes]
, [Total Number of Employees]
, MonthYear [Month]
, LEFT([MonthYear],3) + RIGHT([MonthYear], LEN([MonthYear]) - CHARINDEX('-',[MonthYear]) + 1) FirstThreeLettersOfMonth
FROM dbo.Divisions Divisions CROSS JOIN
(SELECT ISNULL(NULLIF(COUNT(*),0),1) [Total Number of Quizzes]FROM [dbo].[Quiz] ) Quiz
OUTER APPLY (SELECT COUNT(*) AS [Total Number of Employees]
FROM [dbo].[employee]
WHERE employee.DivisionCode = Divisions.SapCode
) Employee
OUTER APPLY (
SELECT ISNULL([Total Number of Quizzes Taken],0) [Total Number of Quizzes Taken],
MonthCTE.MonthYear FROM
(SELECT COUNT(DISTINCT UserQuiz.QuizID) AS [Total Number of Quizzes Taken],
DATENAME(MONTH, UserQuiz.DateTimeComplete) + '-' + DATENAME(YEAR, UserQuiz.DateTimeComplete) MonthYear
FROM UserQuiz UserQuiz
INNER JOIN employee employee
ON UserQuiz.Username = employee.Username
WHERE employee.DivisionCode = Divisions.SapCode
AND UserQuiz.DateTimeComplete BETWEEN @FirstDayOfThreeMonthsBefore AND @LastDayOfPrevMonth
GROUP BY DATENAME(MONTH, UserQuiz.DateTimeComplete), DATENAME(YEAR, UserQuiz.DateTimeComplete)
)Quiz
RIGHT JOIN MonthCTE ON Quiz.MonthYear = MonthCTE.MonthYear
) QuizMonthOutput
То, что я хочу сейчас, это просто показать процент завершения только за последние месяцы.
Я думаю, что моя проблема сейчас заключается в том, чтобы найти общее количество сотрудников в каждом подразделении, чтобы добавить его к этой части вышеуказанного запроса:
SELECT Divisions.DivisionShortcut
, [Percent Completion] = CAST([Sum of all Quizzes Taken by each Employee]
* 100.00 / ([Total Number of Employees]*[Total Number of Quizzes]) AS DECIMAL(18, 2))
Так как это сделать?
Образец желаемого выхода:
Расчет должен быть следующим: Процент выполнения должен рассчитываться, как указано выше, который равен (сумма всех опросов, проведенных каждым сотрудником) / (общее количество сотрудников * общее количество опросов) . Например, в Подразделении A, если есть два сотрудника Emp1 и Emp2. Каждый месяц проводятся четыре викторины. Emp1 взял Викторину № 1 и Викторину № 2, а Emp2 - Викторину № 4. Процент завершения должен быть = ((Emp1 * 2 викторины) + (Emp2 * 1 викторины)) / (общее количество сотрудников * общее количество викторин)
Процент завершения = (2 + 1) / (2 * 4) = 2/8 = 0,25