Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在交叉表查询中聚合不重复的数据_Mysql - Fatal编程技术网

Mysql 如何在交叉表查询中聚合不重复的数据

Mysql 如何在交叉表查询中聚合不重复的数据,mysql,Mysql,我在MySQL中有这样一个示例表:(实际表中有更多的种族和学校) 首先,我将汇总每个种族的数量并按降序排列。查询如下:(我知道如何处理此部分) 最后,我想得到一个如下的交叉表查询:(根据每个种族的人数提取前3名。此外,最终的查询是按每个种族的总人数排序的) 我尝试了下面列出的代码。我无法获取“总和”列。在“麻省理工学院”和“福特汉姆大学”的领导下,每个种族的人数是相同的,并且有重复的。(参考) 我想这是因为我想按每个种族的总人数排序,然后按总人数排序。然而,不同学校中每个种族的人数顺序不同 SE

我在MySQL中有这样一个示例表:(实际表中有更多的种族和学校)

首先,我将汇总每个种族的数量并按降序排列。查询如下:(我知道如何处理此部分)

最后,我想得到一个如下的交叉表查询:(根据每个种族的人数提取前3名。此外,最终的查询是按每个种族的总人数排序的)

我尝试了下面列出的代码。我无法获取“总和”列。在“麻省理工学院”和“福特汉姆大学”的领导下,每个种族的人数是相同的,并且有重复的。(参考) 我想这是因为我想按每个种族的总人数排序,然后按总人数排序。然而,不同学校中每个种族的人数顺序不同

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;