首页 > 解决方案 > 使用 Group by 获取表格的百分比

问题描述

我正在为当地联赛开发一款预测游戏。

比赛由其 SPIELTAG(比赛日)和 MATCH_NR 定义。预测具有匹配和结果(ERGA、ERRGB)

我有一个像这个小提琴一样的表https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/0

我得到了输出来计算每个比赛日和每场比赛的每个结果。

| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT |
| -------- | -------- | ---- | ---- | ------ |
| 4        | 1        | 7    | 1    | 1      |
| 4        | 1        | 7    | 2    | 2      |
| 4        | 1        | 7    | 3    | 5      |
| 4        | 1        | 7    | 4    | 1      |
| 4        | 2        | 1    | 7    | 1      |
| 4        | 2        | 2    | 7    | 6      |
| 4        | 2        | 3    | 7    | 3      |

我想要实现的是,在金额列旁边,例如

| SPIELTAG | MATCH_NR | ERGA | ERGB | AMOUNT | PERC | 
| -------- | -------- | ---- | ---- | ------ | ---- | 
| 4        | 1        | 7    | 1    | 1      | 11.1%| => 1 / 9
| 4        | 1        | 7    | 2    | 2      | 22.2%| => 2 / 9
| 4        | 1        | 7    | 3    | 5      | 55.5%| => 5 / 9
| 4        | 1        | 7    | 4    | 1      | 11.1%| => 1 / 9
| 4        | 2        | 1    | 7    | 1      | 11.1%| => 1 / 9
| 4        | 2        | 2    | 7    | 5      | 55.5%| => 5 / 9
| 4        | 2        | 3    | 7    | 3      | 33.3%| => 3 / 9

其中 PERC 是每个比赛日 SPIELTAG 的选秀百分比。基本上多久一次的结果,(ERGA,ERRGB)的元组预测每个匹配SPIELTAG,MATCH_NR。

我找到了一个帖子,我可以在其中获得所有选秀权的百分比,但不受比赛日限制,匹配元组。

示例:第 1 场比赛(Spieltag 4,第 1 场比赛)有 9 个预测。
1x:7-1
2x:7-2
5x:7-3
1x:7-4
__
9x -> ALL_COUNTS_PER_MATCH

所以 PERC 应该类似于 'AMOUNT' / ALL_COUNTS_PER_MATCH。

标签: mysqlcountpercentage

解决方案


我认为您需要另一个组:

SELECT `t`.`SPIELTAG` AS `SPIELTAG`,
       `t`.`MATCH_NR` AS `MATCH_NR`,
       `t`.`TEAM_A`   AS `ERGA`,
       `t`.`TEAM_B`   AS `ERGB`,
       count(0)       AS `AMOUNT`,
       COUNT(0) / MAX(A.TOTAL_AMOUNT) -- MIN would also work
FROM `TIPPSPIEL_TIPP` `t`
         JOIN (
    -- Calculate the row count by each different spieltag & match_nr combination
    SELECT `t`.`SPIELTAG`,
           `t`.`MATCH_NR`,
           count(0) AS `TOTAL_AMOUNT`
    FROM `TIPPSPIEL_TIPP` `t`
    GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`
) A USING (SPIELTAG, MATCH_NR)
GROUP BY `t`.`SPIELTAG`, `t`.`MATCH_NR`, `t`.`TEAM_A`, `t`.`TEAM_B`
;

https://www.db-fiddle.com/f/o4NXPFfzod39LpMaTzqz3r/3


推荐阅读