Я новичок в изучении 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   %    |

Пожалуйста, помогите мне указать на проблему и возможные решения

Заранее спасибо.

0
Emma 25 Фев 2015 в 07:30

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
0
Hart CO 16 Мар 2015 в 21:17

Сначала найдите 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 
0
Pரதீப் 25 Фев 2015 в 04:59