Mysql

按年齡範圍和性別分組,在某些列上具有聚合功能

  • September 10, 2014

在 Mysql 中,我有一個帶有 id、birth_year 和性別的患者表。下一張表是我有 id,patent_id 的交易

$$ FK from patient $$和檢查日期。我需要選擇行,以便獲得年齡範圍內所有男性和女性的檢查次數。 如何查詢以實現以下表格結果?

20歲以下,男:10次,女:15次

21-30歲,男:20次,女:35次

31-40歲,男:30次,女:45次

…. ……. ……… ……. …….. ……….

81-90,男:10次,女:6次

90歲以上,男性:0次,女性:4次

謝謝你。

兩種選擇。

a) 使用子查詢

select 
 concat(10*floor(age/10), '-', 10*floor(age/10) + 10) as `range`, 
 gender, 
 count(*) as count 
from (
 select 
   *, 
   TIMESTAMPDIFF(YEAR,birth_year,CURDATE()) AS age
 from 
   transaction left join patient on patient_id = patient.id
) as t group by `range`, gender;

+-------+--------+-------+
| range | gender | count |
+-------+--------+-------+
| 0-10  | m      |     2 |
| 10-20 | m      |     1 |
| 20-30 | m      |     3 |
| 30-40 | f      |     2 |
| 30-40 | m      |     2 |
| 50-60 | f      |     1 |
| 50-60 | m      |     1 |
| 60-70 | f      |     5 |
| 60-70 | m      |     3 |
| 70-80 | f      |     1 |
| 70-80 | m      |     6 |
+-------+--------+-------+

b) 先按年齡分組,再按應用範圍分組。

使用 ORM 時,進行子查詢並不容易,所以這可能是個好主意。

性能方面:考慮到人類的平均壽命為 100 年,最多可以有 200 條記錄(100 條男性和 100 條女性),可以在應用程序中輕鬆循環。

select 
 gender, 
 TIMESTAMPDIFF(YEAR,birth_year,CURDATE()) AS age,
 count(*)
from 
 transaction left join patient on patient_id = patient.id
group by age, gender

+--------+------+----------+
| gender | age  | count(*) |
+--------+------+----------+
| m      |    4 |        2 |
| m      |   14 |        1 |
| m      |   24 |        3 |
| f      |   34 |        2 |
| m      |   34 |        2 |
| f      |   54 |        1 |
| m      |   54 |        1 |
| f      |   64 |        5 |
| m      |   64 |        3 |
| f      |   74 |        1 |
| m      |   74 |        6 |
+--------+------+----------+

引用自:https://dba.stackexchange.com/questions/76078