使用 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_idCount,然后在外部查询中找到百分比。

使用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