I want to count the number of male & female user of each religion of each age to obtain a resulting table like the third table below.
tbl_user:
id name dob gender religion
1 raj 1999-12-21 m 1
7 raju 1998-10-10 m 2
8 rajan 2000-11-23 m 3
11 neetu 1992-12-06 f 1
12 sita 1993-06-16 f 2
13 rita 1992-06-08 f 3
14 jenny 1993-05-10 f 2
15 manju 1993-12-16 f 1
16 aanju 1993-03-05 f 3
17 raja 1995-04-06 m 1
18 rajendra 1995-07-03 m 2
19 rajesh 1991-05-02 m 3
tbl_religion:
id name
1 Christian
2 Hindu
3 Islam
Now I want to count the number of male & female user of each religion of each age to obtain a resulting table like the one below. The user can be of any age or or born on any year:
Age Christian Male Christian Female Hindu Male Hindu Female Islam Male Islam Female
14 0 0 0 0 1 0
15 1 0 0 0 0 0
16 0 0 1 0 0 0
20 1 0 1 0 0 0
21 0 1 0 0 0 0
22 0 1 0 2 0 1
23 0 0 0 0 1 1
24 0 0 0 0 0 0
You can use the timestampdiff
function to calculate the age, and use conditional aggregation to count the number in each category like below.
select
timestampdiff(year, dob, now()) age
, sum(gender = 'm' and r.name = 'Christian') Christian_Male
, sum(gender = 'f' and r.name = 'Christian') Christian_Female
, sum(gender = 'm' and r.name = 'Hindu') Hindu_Male
, sum(gender = 'f' and r.name = 'Hindu') Hindu_Female
, sum(gender = 'm' and r.name = 'Islam') Islam_Male
, sum(gender = 'f' and r.name = 'Islam') Islam_Female
from tbl_user u
join tbl_religion r on u.religion = r.id
group by timestampdiff(year, dob, now());
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.