我是SQL学习者的新手,我有一个问题,我希望大家帮助我。我有一张表格User_Activity_Log
,其中包含学生姓名(user_id
),年度出勤日期(User_timestamp
)的格式(2月25日, 2015年)。
说User_Activity_Log
表包含
| user_id | user_timestamp |
| jude | February 22 |
| jude | February 24 |
| annie | February 1 |
| sam | January |
我想知道如何获得一个表格,其中显示了用户ID,学生在月份中看到的计数以及百分比计数,这应该从学生的最大数量(计数)中获得
这是我到目前为止所做的,这给了我错误。
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 % |
请帮我指出问题和可能的解决方案
提前致谢。
答案 0 :(得分:0)
首先在Count
中找到每个user_id
的{{1}},然后在外部查询中找到百分比。
使用sub-select
查找max over()
中的最大值,然后将每个计数除以最大计数以获得百分比。试试这个。
count
答案 1 :(得分:0)
您可以通过在子查询/ 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