按多列分组时包括零计数

时间:2018-11-21 00:42:48

标签: sql

我有一张表格(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个值的组)?

任何帮助将不胜感激!谢谢!

2 个答案:

答案 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 JOINGND列,然后在其上执行RCE

查询#1

OUTER JOIN

View on DB Fiddle

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