使用 SQL 服务器中的最大记录数获取记录的百分比值
Getting percentage value of records using the max count of records in SQL Server
我是 SQL 学习者的新手,我有一个问题希望大家帮助我解决。我有一个 table User_Activity_Log
,其中包含学生姓名及其 ID (user_id
)、当年的出勤日期 (User_timestamp
),格式为(二月) 25,2015).
假设 User_Activity_Log
table 包含
| user_id | user_timestamp |
| jude | February 22 |
| jude | February 24 |
| annie | February 1 |
| sam | January |
我想知道如何获得 table 显示用户 ID、学生在一个月内看到的计数以及百分比计数,这应该从 max(count ) 的学生。
这是我到目前为止所做的,这给了我错误。
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 % |
请帮我指出问题和可能的解决方案
提前致谢。
首先在sub-select
中找到每个user_id
的Count
,然后在外部查询中找到百分比。
使用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
您可以通过在 subquery/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
更新:要在 CASE
表达式中使用 PercentageCount
,类似于:
;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
我是 SQL 学习者的新手,我有一个问题希望大家帮助我解决。我有一个 table User_Activity_Log
,其中包含学生姓名及其 ID (user_id
)、当年的出勤日期 (User_timestamp
),格式为(二月) 25,2015).
假设 User_Activity_Log
table 包含
| user_id | user_timestamp |
| jude | February 22 |
| jude | February 24 |
| annie | February 1 |
| sam | January |
我想知道如何获得 table 显示用户 ID、学生在一个月内看到的计数以及百分比计数,这应该从 max(count ) 的学生。
这是我到目前为止所做的,这给了我错误。
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 % |
请帮我指出问题和可能的解决方案
提前致谢。
首先在sub-select
中找到每个user_id
的Count
,然后在外部查询中找到百分比。
使用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
您可以通过在 subquery/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
更新:要在 CASE
表达式中使用 PercentageCount
,类似于:
;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