TSQL,帮助您查询用户的年龄

时间:2010-06-23 12:41:06

标签: sql sql-server tsql

我有一个注册用户的表,其中我将年份保存为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

感谢

3 个答案:

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