【问题标题】:How to aggregate values inside a column in SQL?如何在 SQL 中的列内聚合值?
【发布时间】:2021-01-15 00:31:05
【问题描述】:

我无法解决这个问题,有什么帮助吗?

Batsman_detail 表有列, [反对(varchar),运行(int),解雇(varchar),场地(varchar)]:

  • opposition 列中包含多个国家/地区。

  • runs 栏显示击球手在那场比赛中的得分。

  • dimissal 列具有以下任何值被捕获/保住/用完/未用完。

  • venue 列包含举行比赛的体育场名称。

现在您应该编写一个查询,以便输出表必须包含击球手在针对巴基斯坦、澳大利亚和斯里兰卡的国家被解雇的次数(原始表包含许多国家。),

示例输出格式:

opposition                caught     bowled      runout      notout    
Pakistan                  3              5               7               9   
Australia                 0              4               4               1    
Sri Lanka                 4              2               3               4

【问题讨论】:

标签: mysql sql group-by count pivot


【解决方案1】:

你似乎想要条件聚合:

select opposition,
    sum(case when dismissal = 'caught'  then runs else 0 end) caught,
    sum(case when dismissal = 'bowled'  then runs else 0 end) bowled,
    sum(case when dismissal = 'run out' then runs else 0 end) run_out,
    sum(case when dismissal = 'not out' then runs else 0 end) not_out
from batsman
group by opposition

这对dismissal 的每个值求和runs。如果你只想统计出现次数,那么:

select opposition,
    sum(dismissal = 'caught')  caught,
    sum(dismissal = 'bowled')  bowled,
    sum(dismissal = 'run out') run_out,
    sum(dismissal = 'not out') not_out
from batsman
group by opposition

【讨论】:

    【解决方案2】:

    您可以清楚地选择所有解雇案例,然后动态旋转

    SET @sql = NULL;
    
    SELECT GROUP_CONCAT(
                 CONCAT(
                        'SUM(CASE WHEN dismissal =''', dismissal, ''' THEN runs ELSE 0 END ) AS ',
                         dismissal
                        )
           )
      INTO @sql
      FROM ( SELECT DISTINCT dismissal
               FROM Batsman_detail 
           ) b;
    
    SET @sql = CONCAT('SELECT opposition,',@sql,
                       ' FROM Batsman_detail
                        GROUP BY opposition'); 
    
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      相关资源
      最近更新 更多