2011-02-22 7 views
0

Предположим, у меня есть таблица SQL Server, которая регистрирует активность пользователя. Предположим, что у него есть идентификаторы пользователя, имя пользователя, дата активности и столбцы типа действия. Я хочу распечатать список всех действий пользователя с одной строкой за каждый месяц активности и столбцом для каждого вида деятельности, суммируя количество раз, когда эта активность произошла в этом месяце. Я пытаюсь сделать это с помощью следующего запроса:Возникли проблемы с запросом в SQL Server

SELECT 
    user_id, 
    user_name, 
    CONVERT(VARCHAR(7), activity_date, 120), 
    SUM(CASE WHEN activity_type = 'Log In' THEN 1 ELSE 0 END), 
    SUM(CASE WHEN activity_type = 'Save Document' THEN 1 ELSE 0 END), 
    SUM(CASE WHEN activity_type = 'Create Document' THEN 1 ELSE 0 END) 
    FROM UserActivity 
    WHERE DATE BETWEEN '11-1-2010 00:00:00' AND '12-31-2010 23:59:59' 
GROUP BY user_id, user_name, CONVERT(VARCHAR(7), activity_date, 120) 

Проблема заключается в том, этот запрос, по существу, дает мне отдельную строку для каждого вида деятельности - много и много строк, без подсчета. Я думаю, что проблема связана с тем, как я делаю даты, потому что если я изменю запрос, чтобы не выбрать дату, я получаю таблицу, которая выглядит «в основном правильной».

Любые мысли?

+0

Что означает @JNK, так это то, что вам нужна группа пользователя user_id, user_name, activity_date – ehudokai

+0

, чтобы отобразить несколько строк вывода, показывающие «отдельные строки». FWIW - хорошая идея указать версию SQL Server в вопросах, таких как добавление тега sql-server-2005 – RichardTheKiwi

ответ

1

У вас не может быть SUM без GROUP BY, по крайней мере, с другими неагрегатами в SELECT. Правильно выполните свое предложение GROUP BY.

SELECT 
user_id, 
user_name, 
CONVERT(VARCHAR(7), activity_date, 120), 
SUM(CASE WHEN activity_type = 'Log In' THEN 1 ELSE 0 END), 
SUM(CASE WHEN activity_type = 'Save Document' THEN 1 ELSE 0 END), 
SUM(CASE WHEN activity_type = 'Create Document' THEN 1 ELSE 0 END) 
FROM UserActivity 
WHERE DATE BETWEEN '11-1-2010 00:00:00' AND '12-31-2010 23:59:59' 
GROUP BY user_id, 
user_name, 
CONVERT(VARCHAR(7), activity_date, 120) 

Для чего это стоит, для диапазонов дат, я предпочитаю использовать

WHERE DATE >= '20101101' 
    AND DATE < '20110101' 

Я уверен, что потерять несколько записей с временной меткой '12 -31-2010 23: 59: 59,997 'не имеет значения, но логично правильно использовать тест < next_date. И чтобы быть педантичным, формат YYYYMMDD является самым надежным, независимо от настроек региона/языка/даты.

+0

Я добавил GROUP BY к моему первоначальному вопросу. В запросе, который я использую, есть GROUP BY, я просто забыл добавить его к этому вопросу. Однако основная проблема сохраняется. – SuperNES

+0

Я ПРИНИМАЮ ЭТО ВСЕ НАЗАД! Итак, в моей GROUP BY была указана активная активность Activity_date, но в инструкции SELECT была изменена activity_date. Мне нужно было сделать тот же конверт в моей группе GROUP BY, что и в моем SELECT. Хороший улов. Благодаря! – SuperNES

Смежные вопросы