2012-07-11 105 views
2

,如果我想打一个查询,得到用户分组年龄的计数SQL查询(按组)

获得数每年为单独:

select count(*) 
from tbl_user 
group by age 

如何我可以做一个自定义组的,所以我可以在例如年龄范围... 这样的例子:

group by ages as 0-18 , 19-25 , 26-... 

回答

3

SUM 1和CASE WHEN在MS SQL Server中,工作是否使用的是SQL的版本?

SELECT 
    SUM(CASE WHEN Age >= 0 AND Age <= 18 THEN 1 ELSE 0 END) AS [0-18], 
    SUM(CASE WHEN Age >= 19 AND Age <= 25 THEN 1 ELSE 0 END) AS [19-25] 
FROM 
    YourTable 
5

外部查询使用子查询和组CASE表达的表达:

select age_group, count(*) 
from (
    select case when age between 0 and 18 then '0-18' 
       when age between 19 and 26 then '19-25' 
       ... 
       end as age_group 
    from tbl_user 
) t 
group by age_group 
1

你可以使用一个CASE声明:

SELECT Sum(CASE WHEN age BETWEEN 0 AND 18 THEN 1 ELSE 0 END) as [0-18], 
Sum(CASE WHEN age BETWEEN 19 AND 25 THEN 1 ELSE 0 END) as [19-25], 
Sum(CASE WHEN age BETWEEN 26 AND 34 THEN 1 ELSE 0 END) as [26-34] 
FROM tbl_user 

这将 “扁平化”将数据分成一行 - 为每个分组获取一行,将其用作View的基础,然后从中进行选择。

1

数据属于表格,不在代码中。年龄类别是数据,恕我直言。

CREATE TABLE one 
     (val SERIAL NOT NULL PRIMARY KEY 
     , age INTEGER NOT NULL 
     ); 
INSERT INTO one (age) SELECT generate_series(0,31, 1); 

CREATE TABLE age_category 
     (low INTEGER NOT NULL PRIMARY KEY 
     , high INTEGER NOT NULL 
     , description varchar 
     ); 
INSERT INTO age_category (low,high,description) VALUES 
    (0,19, '0-18') 
, (19,26, '19-25') 
, (26,1111, '26-...') 
     ; 

SELECT ac.description, COUNT(*) 
FROM one o 
JOIN age_category ac ON o.age >= ac.low AND o.age < ac.high 
GROUP BY ac.description 
     ;