我有一张表格(TCAP),其中包含多个人的性别(2个类别),种族/民族(3个类别)和身高(以英寸为单位的整数)。例如:
GND RCE HGT
1 3 65
1 2 72
2 1 62
1 2 68
2 1 65
2 2 64
1 3 69
1 1 70
我想统计每种可能的性别和种族/民族组合中的个人人数。但是,当我按GND和RCE分组时,它不会显示零计数。我尝试了以下代码:
SELECT
GND,
RCE,
COUNT(*) TotalRecords
FROM TCAP
通过GND,RCE分组;
这给了我:
GND RCE TotalRecords
1 1 1
1 2 2
1 3 2
2 1 2
2 2 1
我希望它显示所有可能的组合。换句话说,即使表中不存在性别为1且种族/种族为3的个人,我也希望将其显示为零计数。因此,像这样:
GND RCE TotalRecords
1 1 1
1 2 2
1 3 2
2 1 2
2 2 1
2 3 0
我已经看过对类似问题的回答,但它们基于单个组,使用带有所有可能值的表的外部联接来解决。我会在这里使用类似的过程吗?我是否将创建一个包含所有6个GND和RCE组合的表?还有另一种方法可以做到这一点,特别是如果组合数量增加(例如,一组具有5个值的组和一组具有10个值的组)?
任何帮助将不胜感激!谢谢!
答案 0 :(得分:1)
您可以尝试将read_rnd_buffer_size=256K # from 1 - pretty astounding you run at all
read_buffer_size=128K # from 8K - for a more reasonable limit
thread_cache_size=40 # from 10 to prepare for growth
innodb_io_capacity=1600 # from 200 to allow higher IOPS
max_connections=50 # from default of 151 until you have more activity
innodb_buffer_pool_size=256M # from 8M likely you will get to innodb tables soon
列用于CROSS JOIN
,GND
列,然后在其上执行RCE
。
查询#1
OUTER JOIN
答案 1 :(得分:1)
使用cross join
生成行,使用left join
生成结果-最后一个group by
:
select g.gnd, r.rce, count(t.gnd) as cnt
from (select distinct gnd from tcap) g cross join
(select distinct rce from tcap) r left join
tcap t
on t.gnd = g.gnd and t.rce = r.rce
group by g.gnd, r.rce;