Mysql 如何在交叉表查询中聚合不重复的数据
我在MySQL中有这样一个示例表:(实际表中有更多的种族和学校) 首先,我将汇总每个种族的数量并按降序排列。查询如下:(我知道如何处理此部分) 最后,我想得到一个如下的交叉表查询:(根据每个种族的人数提取前3名。此外,最终的查询是按每个种族的总人数排序的) 我尝试了下面列出的代码。我无法获取“总和”列。在“麻省理工学院”和“福特汉姆大学”的领导下,每个种族的人数是相同的,并且有重复的。(参考) 我想这是因为我想按每个种族的总人数排序,然后按总人数排序。然而,不同学校中每个种族的人数顺序不同Mysql 如何在交叉表查询中聚合不重复的数据,mysql,Mysql,我在MySQL中有这样一个示例表:(实际表中有更多的种族和学校) 首先,我将汇总每个种族的数量并按降序排列。查询如下:(我知道如何处理此部分) 最后,我想得到一个如下的交叉表查询:(根据每个种族的人数提取前3名。此外,最终的查询是按每个种族的总人数排序的) 我尝试了下面列出的代码。我无法获取“总和”列。在“麻省理工学院”和“福特汉姆大学”的领导下,每个种族的人数是相同的,并且有重复的。(参考) 我想这是因为我想按每个种族的总人数排序,然后按总人数排序。然而,不同学校中每个种族的人数顺序不同 SE
SELECT race,
COUNT(IF(school="MIT",race,0)) as MIT,
COUNT(IF(school="Fordham",race,0)) as Fordham
FROM table_name
GROUP by race
它应该是SUM()
,而不是COUNT()
希望这有帮助。您可以使用动态sql查询来实现这一点 查询
set @query = null;
select
group_concat(distinct
concat(
'count(case when school = ''',
school, ''' then school end) as ',school
)
) into @query
from your_table_name ;
set @query = concat('select race, ', @query, ',count(*) as `SUM` from your_table_name
group by race order by count(*) desc limit 3
');
prepare stmt from @query;
execute stmt;
deallocate prepare stmt;
输出
+----------+-----+---------+-----+-----+
| race | MIT | Fordham | NYU | SUM |
+----------+-----+---------+-----+-----+
| Asian | 4 | 4 | 3 | 11 |
| White | 3 | 2 | 1 | 6 |
| Hispanic | 1 | 2 | 1 | 4 |
+----------+-----+---------+-----+-----+
首先:
select * from
(
select count(*) as count,race from table1 group by race
) as data
order by data.count desc;
最后
select data.* from (
SELECT race,
SUM(IF(school='MIT',1,0)) as MIT,
SUM(IF(school='Fordham',1,0)) as Fordham,
SUM(IF(school='NYU',1,0)) AS NYU,
COUNT(*) AS total_Sum
FROM table1
GROUP by race ) as data
order by data.total_Sum desc;
谢谢这很有帮助。就在附近。但是总数(*)将对包括美国印第安人在内的所有种族进行汇总。但是,如果我只想对前三名的人数或我想展示的学校数量进行汇总?
set @query = null;
select
group_concat(distinct
concat(
'count(case when school = ''',
school, ''' then school end) as ',school
)
) into @query
from your_table_name ;
set @query = concat('select race, ', @query, ',count(*) as `SUM` from your_table_name
group by race order by count(*) desc limit 3
');
prepare stmt from @query;
execute stmt;
deallocate prepare stmt;
+----------+-----+---------+-----+-----+
| race | MIT | Fordham | NYU | SUM |
+----------+-----+---------+-----+-----+
| Asian | 4 | 4 | 3 | 11 |
| White | 3 | 2 | 1 | 6 |
| Hispanic | 1 | 2 | 1 | 4 |
+----------+-----+---------+-----+-----+
select * from
(
select count(*) as count,race from table1 group by race
) as data
order by data.count desc;
select data.* from (
SELECT race,
SUM(IF(school='MIT',1,0)) as MIT,
SUM(IF(school='Fordham',1,0)) as Fordham,
SUM(IF(school='NYU',1,0)) AS NYU,
COUNT(*) AS total_Sum
FROM table1
GROUP by race ) as data
order by data.total_Sum desc;