如何将列名打印为mysql中的行数? [复制]

Posted

技术标签:

【中文标题】如何将列名打印为mysql中的行数? [复制]【英文标题】:How to print column names as count of rows in mysql? [duplicate] 【发布时间】:2021-02-13 04:54:35 【问题描述】:

我有下表

opposition    |   dismissals
--------------+-------------
Australia     |   lbw
South Africa  |   run_out
England       |   bowled
Australia     |   run_out
England       |   lbw

我想打印输出如下

Opposition    |  lbw  | run_out  | bowled
--------------+-------+----------+-------
Australia     |  1    | 1        | 0
England       |  1    | 0        | 1
South Africa  |  0    | 1        | 0

我不知道如何使用行值作为列名和打印相应的计数。任何人都可以在mysql中建议如何做到这一点?我现在被这个问题困扰了好几天。甚至尝试谷歌搜索,但我找不到任何东西。

【问题讨论】:

这被称为“透视”,以便您将来需要在 Google 上搜索这个。这里有很多答案:How can I return pivot table output in MySQL? 谢谢...我很高兴知道... :) 【参考方案1】:

考虑到 dismissals 列的明显选择值可能不同,动态旋转可能比静态旋转更好,例如

SET @sql = NULL;

SELECT GROUP_CONCAT(
             CONCAT('SUM( dismissals =''', dismissals, ''' ) AS ',dismissals)
       )
  INTO @sql
  FROM ( SELECT DISTINCT dismissals FROM tab ) t;
       
SET @sql = CONCAT('SELECT opposition,',@sql,' FROM tab GROUP BY opposition'); 


PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Demo

【讨论】:

【参考方案2】:

使用条件聚合。在 MySQL 中:

select opposition,
    sum(dismissals = 'lbw'    ) lbw,
    sum(dismissals = 'run_out') run_out,
    sum(dismissals = 'bowled' ) bowled
from mytable
group by opposition

【讨论】:

谢谢您的回答...但我有一个疑问,不应该在每个列名之前都有“as”关键字... ... sum(dismissals ='lbw') AS lbw 等等....我不确定只是问... @John:这个关键字是可选的。 哦,好吧....我是新手,所以不知道...谢谢您的澄清...

以上是关于如何将列名打印为mysql中的行数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

MySql 执行countcount(*) 与 count(列名) 区别

mysql 分组聚集

mysql 分组聚集

MS SQL 如何查看一个数据库中所有表的行数

如何从 MySQL 数据库中搜索列名? [复制]

将列名更改为 MySQL 表中的第一行