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