Я новичок в изучении SQL, и у меня есть проблема, с которой вы все мне должны помочь. У меня есть таблица User_Activity_Log
, которая содержит имена студентов с их идентификаторами (user_id
), датой посещения в году (User_timestamp
) в формате (25 февраля 2015 г.) .
Скажем, таблица User_Activity_Log
содержит
| user_id | user_timestamp |
| jude | February 22 |
| jude | February 24 |
| annie | February 1 |
| sam | January |
Я хотел бы знать, как получить таблицу, показывающую идентификатор пользователя, количество подсчетов, которые ученик видит в месяце, и процентное количество, которое должно быть получено от максимального (количества) ученика.
Вот что я сделал до сих пор, это дает мне ошибку.
USE FinalYearProject
declare @maxval int
select
@maxval = (SELECT MAX(fromsubq.SM) as PA
FROM
(SELECT COUNT (user_Id) as SM
FROM dbo.User_Activity_Log
WHERE user_Timestamp LIKE 'February%'
GROPU BY User_Id) fromsubq
)
(SELECT COUNT
FROM dbo.User_Activity_Log
WHERE user_Timestamp like 'February%'
GROUP BY user_Id) * 100.0 / @maxval
Ожидаемый результат должен быть
| User_id | Count | PercentageCount |
| Jude | 2 | 100 % |
| annie | 1 | 50 % |
| sam | 0 | 0 % |
Пожалуйста, помогите мне указать на проблему и возможные решения
Заранее спасибо.
2 ответа
Вы можете сделать это, используя условное агрегирование в подзапросе / cte и добавив OVER()
к агрегату:
;with cte AS (SELECT User_ID
,SUM(CASE WHEN user_timestamp LIKE 'February%' THEN 1 ELSE 0 END) as CT
FROM User_Activity_Log
GROUP BY User_ID
)
SELECT User_ID
,CT
,CT*100.0 / MAX(CT) OVER() AS PercentageCount
FROM cte
ORDER BY CT DESC
Демонстрация: SQL Fiddle
Примечание: хранить даты в виде строк - плохая практика, если вы вообще можете этого избежать.
Изменить: вот как это будет сделано с подзапросом вместо cte
:
SELECT User_ID
,CT
,CT*100.0 / MAX(CT) OVER() AS PercentageCount
FROM (SELECT User_ID
,SUM(CASE WHEN user_timestamp LIKE 'February%' THEN 1 ELSE 0 END) as CT
FROM User_Activity_Log
GROUP BY User_ID
) AS Sub
ORDER BY CT DESC
ОБНОВЛЕНИЕ: чтобы использовать PercentageCount
в выражении CASE
, например:
;with cte AS (SELECT User_ID
,SUM(CASE WHEN user_timestamp LIKE 'February%' THEN 1 ELSE 0 END) as CT
FROM User_Activity_Log
GROUP BY User_ID
)
,cte2 AS (SELECT User_ID
,CT
,CT*100.0 / MAX(CT) OVER() AS PercentageCount
FROM cte
)
SELECT *,CASE WHEN PercentageCount > .5 THEN 'Qualified' ELSE 'NotQualified' END AS Qualified
FROM cte2
ORDER BY CT DESC
Сначала найдите Count
на user_id
в sub-select
, затем найдите процент во внешнем запросе.
Используйте max over()
, чтобы найти максимальное значение в count
, затем разделите каждое количество на максимальное количество, чтобы получить процент. Попробуй это.
SELECT user_Id,
Cnt AS [Count],
( Cnt / Max(Cnt) OVER() ) * 100 AS PercentageCount
FROM (SELECT Count(user_Id) AS Cnt,
user_Id,
FROM dbo.User_Activity_Log
WHERE user_Timestamp LIKE 'February%'
GROUP BY User_Id) A
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.