使用SQL Server中的最大记录数获取记录的百分比值

时间:2015-02-25 04:30:25

标签: sql sql-server sql-server-2008

我是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   %    |

请帮我指出问题和可能的解决方案

提前致谢。

2 个答案:

答案 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