mysql - 如何将多行转换为一行?

标签 mysql sql

我有这张表:

CREATE TABLE IF NOT EXISTS `usage` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `host_id` int(10) unsigned NOT NULL,
  `time_id` int(10) unsigned NOT NULL,
  `state` enum('LinuxTU','LinuxExt','View','Browser','Idle','Offline') CHARACTER SET latin1 NOT NULL DEFAULT 'Offline',
  PRIMARY KEY (`id`),
  KEY `host_id` (`host_id`),
  KEY `time_id` (`time_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=12998 ;

该表存储不同计算机的状态信息。

我实际上可以得到这个。它存储了我需要的值,但格式不正确:

SELECT time_id, state, COUNT(state) statecount
FROM `usage` u
GROUP BY time_id, state

结果:

time_id  state      statecount
      7  LinuxTU            20
      7  LinuxExt           11
      7  View               51
      7  Browser             5
      7  Idle               67
      7  Offline            83
      8  LinuxTU            22
      8  LinuxExt           10
      8  View               55
      8  Browser             4
      8  Idle               66
      8  Offline            80

我想得到一个包含计数状态值的矩阵,如下所示:

time_id   LinuxTU   LinuxExt   View   Browser   Idle   Offline
      7        20         11     51         5     67        83
      8        22         10     55         4     66        80

我怎样才能得到这个?

最佳答案

好的,数据透视表是关键。也许有一个没有子查询的查询,但我没有找到它。而且这个查询对于列的变化并不灵活。 但它有效...

SELECT time_id,
    SUM(IF(state='LinuxTU', statecount, NULL)) AS LinuxTU,
    SUM(IF(state='LinuxExt', statecount, NULL)) AS LinuxExt,
    SUM(IF(state='View', statecount, NULL)) AS View,
    SUM(IF(state='Browser', statecount, NULL)) AS Browser,
    SUM(IF(state='Idle', statecount, NULL)) AS Idle,
    SUM(IF(state='Offline', statecount, NULL)) AS Offline
FROM (
    SELECT time_id, state, COUNT(state) statecount
    FROM `usage` u
    GROUP BY time_id, state
) AS subtab
GROUP BY time_id

关于mysql - 如何将多行转换为一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28563420/

相关文章:

mysql - 存储过程 VB.NET MYSQL

mysql - 在magento中批量替换产品标题

在mysql中插入文件字节码时出现php错误

sql - 如何从db2中选择CLOB数据类型数据

SQL SELECT WHERE 字段包含单词

mysql - 选择一周中的 5 个日期

sql - 删除所有找不到 JOIN 的行?

sql - 如何将 OLE 自动化日期值转换为 SQL Server 中的日期

mysql - 在更新任何表之前创建 MySQL 触发器

php在for循环中将数据插入sql