Не группировка по дате? - PullRequest
1 голос
/ 22 июня 2010

У меня есть таблица базы данных, в которой хранится информация о документе (DocID, Имя, Тип, Владелец и т. Д.).Затем у меня есть другая таблица, в которой хранится время загрузки документа (DocID, DownloadTime и т. Д.).Я пытаюсь настроить страницу для записи количества обращений, которые различные типы документов (политики, формы, публикации и т. Д.) Получают за определенный месяц и год (у меня есть раскрывающийся список для каждого, который выбирает пользователь).

Я также хочу иметь возможность оставить месяц или год пустыми, чтобы пользователь мог получать хиты за все месяцы в году, например.Запрос ниже работает нормально, когда пользователь выбирает месяц и год.Тем не менее, когда месяц или год оставлены пустыми, в виде таблицы не отображаются сгруппированные типы документов.Например, если я хочу просмотреть хиты за январь 2010 года, я получаю:

Policies : 210 hits
Forms: 98 hits

и т. Д.

Но когда пользователи выбирают все месяцы в 2010 году, пользователь получает:

Policies: 210 hits
Policies: 87 hits
Policies: 23 hits
Policies: 87 hits
Forms 

и т. Д.

Итак, я получаю все месяцы в разных строках, но не сгруппированы как один вид.Где неправильный запрос?

SELECT COUNT(Counter.DocID) AS Counter,
       Doc.DocType,
       MONTH(Counter.DownloadDate) AS MonthDownload,
       YEAR(Counter.DownloadDate) AS YearDownload
  FROM Counter
       INNER JOIN Doc ON Counter.DocID = Doc.DocID
 GROUP BY Doc.DocType,
       MONTH(Counter.DownloadDate),
       YEAR(Counter.DownloadDate)
HAVING (MONTH(Counter.DownloadDate) = @Month1 OR @Month1 IS NULL) AND
       (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL)

Ответы [ 3 ]

2 голосов
/ 22 июня 2010

Проблема в предложении GROUP BY.

Если вы скажете GROUP BY DocType, Month, Year, это означает, что в любое время любой из них отличается от других, подсчитайте их отдельно .

Что вам нужно сделать, это GROUP BY только за год , если вы хотите получить итоги за весь год, и сгруппировать по месяцам, годам, если вы хотитесчитать за каждый месяц каждого года.

0 голосов
/ 22 июня 2010

Удалите связанную с месяцем группировку из запроса, чтобы получить одну агрегированную запись для каждого типа документа в заданном году.

SELECT COUNT(Counter.DocID) AS Counter,
       Doc.DocType,
       YEAR(Counter.DownloadDate) AS YearDownload
  FROM Counter
       INNER JOIN Doc ON Counter.DocID = Doc.DocID
 GROUP BY Doc.DocType,
       YEAR(Counter.DownloadDate)
HAVING 
       (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL)
0 голосов
/ 22 июня 2010

Если вам нужен годовой агрегат, вы должны использовать другой запрос, который не группируется по месяцам, или вы должны постобработать результаты, чтобы сложить значения за разные месяцы в году.

Как написано, ваш код всегда группируется по месяцам и годам, генерируя новые строки при изменении месяца - он не может делать ничего другого, не нарушая каждое правило (хорошо, я преувеличиваю - много правил) в SQL.

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