Как показать результаты за последние три месяца? - PullRequest
0 голосов
/ 11 декабря 2011

Я занимаюсь разработкой веб-системы управления обучением, которая покажет руководству отчет об обучении для каждого подразделения. Моя база данных выглядит следующим образом:

Таблица сотрудников: Имя пользователя, Имя, Работа, DivisionID

Таблица подразделений: DivisionID, DivisionName

Таблица тестов: QuizID, Название, Описание

Таблица UserQuiz: UserQuizID, Счет, DateTimeComplete, QuizID, Имя пользователя

ПРИМЕЧАНИЕ: Первым атрибутом в каждой таблице является первичный ключ.

SQL-запрос, который я использую для этой задачи:

SELECT COUNT(DISTINCT dbo.UserQuiz.QuizID) AS [Total Number of Quizzes], 
  dbo.Divisions.DivisionName, 
  DATENAME(Month, dbo.UserQuiz.DateTimeComplete) AS Month 
FROM dbo.UserQuiz 
INNER JOIN dbo.Quiz 
  ON dbo.UserQuiz.QuizID = dbo.Quiz.QuizID 
INNER JOIN  dbo.employee 
  ON dbo.UserQuiz.Username = dbo.employee.Username 
RIGHT OUTER JOIN dbo.Divisions 
  ON dbo.employee.DivisionCode = dbo.Divisions.SapCode 
GROUP BY dbo.Divisions.DivisionName,
  DATENAME(Month, dbo.UserQuiz.DateTimeComplete)

В этом запросе будет показано общее количество проведенных тестов по каждому подразделению за месяц. Теперь я хочу показать эти результаты за последние три месяца. Кроме того, я хочу показать все подразделения, даже если есть разделение, которое не принимает никаких тестов. Это означает, что я хочу показать разделение с нулевым количеством пройденных тестов.

1 Ответ

1 голос
/ 11 декабря 2011

Для отображения ВСЕХ Подразделений, которые должны быть сначала в списке, затем ВЛЕВО СОЕДИНЕНЫ к результатам подсчета. Вам нужно COALESCE () значение, так что если ноль, вместо этого вернет ноль. Что касается последних 3 месяцев, вам просто нужно добавить предложение WHERE для диапазона дат.

Редактировать ... за комментарий. Я сделал еще один шаг вперед, и для каждого деления я создал его в виде кросс-таблицы, чтобы показать деление с 3 столбцами, показывающими количество каждого соответствующего месяца в одной строке ... Итак, имена получающихся столбцов будет таким же, но будет отражать фактическое содержание данных за месяц ... Фактически скорректировано предложение WHERE за 2 месяца ... 2 месяца назад плюс текущее значение равно 3 месяцам.

 select 
          d.DivisionName,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, DateAdd( month, -2, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as TwoMonthsAgoCount,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, DateAdd( month, -1, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as OneMonthAgoCount,
          SUM( case when PreQuery.ByMonth = DATENAME(Month, GetDate())
                    then PreQuery.DistinctQuizes else 0 end ) as CurrentMonthCount
       from
          Divisions d
             left join
             ( select count( distinct UQ.QuizID ) DistinctQuizes,
                     DATENAME(Month, UQ.DateTimeComplete) ByMonth,
                      d2.DivisionName
                  from 
                     UserQuiz UQ
                        JOIN Quiz Q on UQ.QuizID = Q.QuizID
                        JOIN Employee E on UQ.UserName = E.UserName
                           JOIN Divisions D2 on E.DivisionCode = D2.SapCode
                  where
                    UQ.DateTimeComplete between 
                        DateAdd( month, -2, GetDate())  and GetDate() 
                  group by 
                     d2.DivisionName,
                     DATENAME(Month, UQ.DateTimeComplete)
             ) PreQuery
             ON d.DivisionName = PreQuery.DivisionName
   GROUP BY
      d.DivisionName

Используя «GetDate ()», он возвращает любую текущую дату на компьютере. Это будет дата окончания. Первой датой будет арифметика базовой даты ... Используйте функцию DateAdd, добавьте интервал, основанный на месяцах -2 (отрицательный, чтобы перейти НАЗАД), на основе текущей даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...