TSQL, помогите с небольшим запросом о возрасте пользователя

У меня есть таблица с зарегистрированными пользователями, в которой я сохраняю год как значения varchar просто потому, что беру всего год. Я хочу создать круговую диаграмму с возрастом, чтобы показать, какие пользователи чаще регистрируются.

Приведенный ниже запрос дает мне количество возрастов пользователей, которые появляются в таблице более 5 раз, чтобы избежать небольших результатов. Хотя эти небольшие результаты, ниже "имея ount(userID)>5" я хочу появиться как другие. Что я должен добавить к этому запросу или, возможно, изменить его. Я могу создать глупые решения, например, взять все годы, которые появляются в первоначальном запросе, а затем выбрать все, кроме того года, но должен быть лучший и более творческий способ написания этого запроса.

Таким образом, результат будет примерно таким: 1 10 1990 2 4 1980 3 10 других

select count(userID) ageCount,userBirthYear from Users
group by userBirthYear
having count(userID)>5
order by count(userID) desc

Спасибо

3 ответа

Решение

Вот один из способов (при условии SQL2005 или более поздней версии).

With Ages As
(
select count(userID) ageCount,userBirthYear 
from Users
group by userBirthYear
)

SELECT ageCount,userBirthYear FROM Ages WHERE ageCount>5
UNION ALL
SELECT sum(ageCount) ,'others' As userBirthYear FROM Ages WHERE ageCount<=5

Вот решение для перегруппировки (без объединения), чтобы избежать повторного ввода-вывода.

Основная идея заключается в том, что вы хотите, чтобы каждая запись вносила свой вклад в результат, поэтому не должно быть предложений WHERE или HAVING.

SELECT
  SUM(sub.ageCount) as ageCount,
  sub.userBirthYear
FROM
(
  SELECT Count(userId) ageCount,
    CASE WHEN COUNT(userID) > 5)
         THEN userBirthYear
         ELSE 'Other'
    END as userBirthYear
  FROM Users
  GROUP BY userBirthYear
) as sub
GROUP BY sub.userBirthYear
select  count(userID) ageCount,userBirthYear from Users 
group   by userBirthYear 
having  count(userID)>5 
union
SELECT  SUM(agecount), 'Others' 
FROM    (select count(userID) ageCount,'Others' userBirthYear from Users 
     group  by userBirthYear 
     having count(userID)<5)TMP 
order by    count(userID) desc
Другие вопросы по тегам