我正在编写对数据集的查询,并将该表作为CTE(T3) (表T3的DDL和DML语句如下所示)

games regions gold silver bronze total
1896 Summer Greece 2 4 4 10
1896 Summer UK 3 1 1 5
1896 Summer Switzerland 0 0 0 0
1896 Summer USA 8 4 1 13
1896 Summer Germany 7 1 0 8
1896 Summer France 1 2 1 4
1896 Summer Hungary 0 1 0 1
1896 Summer Australia 2 0 1 3

注:T3的DDL和DML语句:

DDL语句: create table t3 (games varchar(20), regions varchar(20), gold int, silver int, bronze int, total int);

和DML语句包括:

insert into t3 values ('1896 Summer', 'Greece', 2, 4, 4, 10);
insert into t3 values ('1896 Summer', 'UK', 3, 1, 1, 5);
insert into t3 values ('1896 Summer', 'Switzerland', 0, 0, 0, 0);
insert into t3 values ('1896 Summer', 'USA', 8, 4, 1, 13);
insert into t3 values ('1896 Summer', 'Germany', 7, 1, 0, 8);
insert into t3 values ('1896 Summer', 'France', 1, 2, 1, 4);
insert into t3 values ('1896 Summer', 'Hungary', 0, 1, 0, 1);
insert into t3 values ('1896 Summer', 'Australia', 2, 0, 1, 3);

为此,我写了一个查询:


select distinct games, 
       concat(max(regions) over (partition by games order by gold desc), "-", max(gold) over(partition by games)) as gold_count,
       concat(max(regions) over (partition by games order by silver desc, regions), "-", max(silver) over(partition by games)) as silver_count,
       concat(max(regions) over (partition by games order by bronze desc, regions), "-", max(bronze) over(partition by games)) as bronze_count,
       concat(max(regions) over (partition by games order by total desc), "-", max(total) over(partition by games)) as total
from t3;

从这个查询中,我得到了以下结果

games gold_count silver_count bronze_count total
1896 Summer USA-8 Greece-4 Greece-4 USA-13
1896 Summer USA-8 USA-4 Greece-4 USA-13
1896 Summer USA-8 USA-4 UK-4 USA-13
1896 Summer USA-8 USA-4 USA-4 USA-13

我如何才能得到这样的结果:

games gold_count silver_count bronze_count total
1896 Summer USA-8 Greece-4 Greece-4 USA-13
1896 Summer USA-8 USA-4 Greece-4 USA-13

或者像这样:

games gold_count silver_count bronze_count total
1896 Summer USA-8 Greece-4 & USA-4 Greece-4 USA-13

推荐答案

对于每一场比赛,您希望显示每种类型奖牌(金牌、银牌、铜牌)的最高区域以及与平局相关的总体情况.

一个选项是对每种奖牌的区域进行rank()分的排名,然后用条件聚合进行旋转:

select games, 
    group_concat( case when rn_gold   = 1 then concat(regions, '-', gold  ) end separator ' & ') as gold_count,
    group_concat( case when rn_silver = 1 then concat(regions, '-', silver) end separator ' & ') as silver_count,
    group_concat( case when rn_bronze = 1 then concat(regions, '-', bronze) end separator ' & ') as bronze_count,
    group_concat( case when rn_total  = 1 then concat(regions, '-', total ) end separator ' & ') as total_count
from (
    select t.*,
        rank() over(partition by games order by gold   desc) rn_gold,
        rank() over(partition by games order by silver desc) rn_silver,
        rank() over(partition by games order by bronze desc) rn_bronze,
        rank() over(partition by games order by total  desc) rn_total
    from t3 t
) t
group by games

对于您的样本数据,这将产生以下结果:

games gold_count silver_count bronze_count total_count
1896 Summer USA-8 USA-4 & Greece-4 Greece-4 USA-13

fiddle

Mysql相关问答推荐

mysql使用LIKE查找二进制字段有问题

为什么我安装MySQL时不能使用3306端口?

MySQL - 事务绑定多个存储过程调用和回滚的简单方法?

特定时间段内每个客户的运行总计

是否可以使用以EXPLAIN EXTENDED ...开头的 SQL 语句修改数据?

任何值的 SQL WHERE 子句?

Select 最高等级最多的部门名称

使用适配器设计模式和外观设计模式实现

MYSQL 删除两个已知字符串之间的字符串

在表中找到最大值,然后分别显示SQL组和每个SQL组中的最大值计数

使用 JOIN 计算列中的所有值

MySQL在定义表的位置后抛出错误

限制正则​​表达式中多字符通配符的范围

有没有办法在 Zend Framework 1.5 中执行INSERT...ON DUPLICATE KEY UPDATE?

你如何在 Node.js 中模拟 MySQL(没有 ORM)?

MySQL - 使一对值唯一

MySQL INSERT IF(自定义 if 语句)

mysql 按日期 Select 总和组

MySQL行格式:固定和动态之间的区别?

在 PHP/MySQL 中将日期时间存储为 UTC