关于使用多个 SQL GROUP BY 语句的问题

Posted

技术标签:

【中文标题】关于使用多个 SQL GROUP BY 语句的问题【英文标题】:Question on using multiple SQL GROUP BY statements 【发布时间】:2021-12-24 05:01:26 【问题描述】:

所以最终我想显示投手在我的棒球联盟中赢得赛扬奖的总次数,然后是他们赢得该奖项的赛季年份,但按联盟名称排序,因为投手本可以在同一年在不同联赛中获得该奖项。

这就是我试图显示数据的方式:Andrew Jones (4) - 2021, 2020 (18+); 2021 年(28 岁以上); 2021 (38+),因此我需要Seasons 列来吐出这样的数据:2021, 2020 (18+); 2021 年(28 岁以上); 2021 年(38 岁以上)

我有 3 个 mysql 表(SEASON、LEAGUES、CY_YOUNG):

联赛

| LEAGUE_ID | LEAGUE_NAME   |
| -------- | -------------- |
| 1        | 18+            |
| 2        | 28+            |
| 3        | 38+            |
| 4        | 48+            |

季节

| SEASON_ID| LEAGUE_ID      | SEASON_YEAR |
| --------   | -------------| ----------- |
| 332        | 1            |   2021    |
| 333        | 2            |   2021    |
| 334        | 3            |   2021    |
| 335        | 4            |   2021    |
| 300        | 1            |   2020    |
| 301        | 2            |   2020    |
| 302        | 3            |   2020    |
| 303        | 4            |   2020    |

CY_YOUNG

| SEASON_ID  | PLAYER_NAME    | PLACE     |
| --------   | -------------- | ----------|
| 332        | Andrew Jones   |   1       |
| 332        | Mike Smith     |   2       |
| 333        | Andrew Jones   |   1       |
| 333        | Jacob Grimes   |   2       |
| 334        | Andrew Jones   |   1       |
| 334        | Travis Deane   |   2       |
| 300        | Andrew Jones   |   1       |

这是我当前的 SQL 查询:


   SELECT PLAYER_NAME, COUNT(ID) AS TotalWins, GROUP_CONCAT(DISTINCT CONCAT(S.SEASON_YEAR,' (',L.LEAGUE_NAME) 
   ORDER BY S.SEASON_YEAR DESC SEPARATOR '), ') AS Seasons
   FROM CY_YOUNG
   JOIN SEASONS S ON S.SEASON_ID = CY_YOUNG.SeasonID
   JOIN LEAGUES L ON L.LEAGUE_ID = S.LEAGUE_ID
   WHERE CY_YOUNG.Place = 1
   GROUP BY PLAYER_NAME
   HAVING TotalWins > 1
   ORDER BY TotalWins DESC;  

Seasons 列目前的吐槽是这样的:2021 (18+), 2020 (18+), 2021 (38+) 但我希望它像这样吐槽:2021, 2020 (18+); 2021 年(28 岁以上); 2021 年(38 岁以上)。我知道我很接近所以任何帮助表示赞赏!

【问题讨论】:

我认为您需要在 concat 中使用另一个 group_concat,因为您首先要连接每个球员每年的联赛,然后仅聚合每个用户。您可能需要在子查询中执行第一个 group_concat 并在外部查询中使用其输出。 谢谢影子,理论上我知道这是我需要做的,但由于某种原因,我似乎无法让我的大脑用 SQL 翻译它。 【参考方案1】:

您需要 2 个级别的聚合:

SELECT PLAYER_NAME, 
       SUM(counter) AS TotalWins,  
       GROUP_CONCAT(years, ' (', LEAGUE_NAME, ')' ORDER BY LEAGUE_NAME, years) AS Seasons
FROM (
  SELECT PLAYER_NAME, L.LEAGUE_NAME,
         COUNT(*) counter,
         GROUP_CONCAT(S.SEASON_YEAR ORDER BY S.SEASON_YEAR DESC) AS years
  FROM CY_YOUNG C
  JOIN SEASONS S ON S.SEASON_ID = C.SEASON_ID
  JOIN LEAGUES L ON L.LEAGUE_ID = S.LEAGUE_ID
  WHERE C.Place = 1
  GROUP BY C.PLAYER_NAME, L.LEAGUE_NAME
) t  
GROUP BY PLAYER_NAME
HAVING TotalWins > 1
ORDER BY TotalWins DESC; 

请参阅demo。

【讨论】:

你是我的英雄!非常感谢!

以上是关于关于使用多个 SQL GROUP BY 语句的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Oracle的SQL语句中group by的空值问题请教?

sql查询中如何用group by查询出完整的一行记录?

sql语句中的group by啥意思

sql语句中的group by啥意思

sql中group by 是啥意思啊?请教谢谢

sql语句中的group by要怎么用!!