我有一个注册用户的表,其中我将年份保存为varchar值只是因为我只花了一年时间。我想用年龄来创建饼图,以显示哪些用户更有可能注册。
下面的查询给出了用户年龄的计数,这些用户年龄在表格中显示超过5次,以避免小的结果。虽然这些小结果,在“有ount(userID)> 5”下面我希望看起来像其他人一样。我应该为此查询添加什么或者可能重新设计它。我可以创建愚蠢的解决方案,比如在初始查询中显示所有年份,然后选择除了那些年份之外的所有年份,但必须有更好,更有创意的方式来编写此查询。
所以结果会是这样的 1990年1月10日 1980年2月2日 另外3人
select count(userID) ageCount,userBirthYear from Users
group by userBirthYear
having count(userID)>5
order by count(userID) desc
感谢
答案 0 :(得分:3)
这是一个重组解决方案(无联合),以避免重复IO。
基本的想法是你希望每条记录都对结果有所贡献,所以不应该有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
答案 1 :(得分:2)
这是一种方式(假设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
答案 2 :(得分:1)
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