【问题标题】:count row values as column name mysql将行值计算为列名mysql
【发布时间】:2014-03-24 04:58:16
【问题描述】:

我有桌子user_completed

CREATE TABLE IF NOT EXISTS `user_completed` (
  `rowId` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `designer_id` int(10) unsigned NOT NULL,
  `status` varchar(54) DEFAULT NULL,
  PRIMARY KEY (`rowId`),
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;


INSERT INTO `user_completed` (`rowId`, `designer_id`, `status`) VALUES
(1, 1, accept),
(2, 1, reject),
(3, 1, accept),
(4, 1, reject),
(5, 1, overtime),
(6, 2, accept)
(7, 2, accept)
(8, 3, accept)
(9, 2, reject);

看起来像:

rowId   designer_id    status 
1           1          accept
2           1          reject
3           1          accept
4           1          reject
5           1          overtime
6           2          accept
7           2          accept
8           3          accept
9           2          reject

我想得到以下结果:

designer_id   accept   overtime   reject
1             2        1          2
2             2        0          1
3             1        0          0

但我不知道如何将 designer_id 分组,然后将不同的 status 计数,并将每个分组到上面的列中。

【问题讨论】:

标签: mysql select row


【解决方案1】:

试试这个

SELECT  designer_id,
    SUM(IF(status = 'accept',1,0)) as 'Accept',
    SUM(IF(status = 'reject',1,0)) as 'Reject',
    SUM(IF(status = 'overtime',1,0)) as 'Overtime'
FROM 
    user_completed
Group By designer_id

Fiddle Demo

正如Jack 所说,这很简单

SELECT  designer_id,
    SUM(status = 'accept') as 'Accept',
    SUM(status = 'reject') as 'Reject',
    SUM(status = 'overtime') as 'Overtime'
FROM 
    user_completed
Group By designer_id

Fiddle Demo

【讨论】:

    【解决方案2】:

    试试这个吧

    select designer_id, 
    count(case status  when 'accept'then 1 else null end)as accept,
    count(case status when 'reject'then 1 else null end)as reject,
    count(case status when 'overtime'then 1 else null end)as overtime
    from user_completed group by designer_id
    

    【讨论】:

      【解决方案3】:

      如果您不知道有多少不同的status,那么您可以查看此链接以获取解决方案

      Mysql query to dynamically convert rows to columns

      例如,您可以使用以下内容

      SET @sql = NULL;
      SELECT
        GROUP_CONCAT(DISTINCT
         CONCAT(
           'SUM(IF(`status` = "', `status`, '",1,0)) AS ', `status`)
        ) INTO @sql
      FROM user_completed;
      
      SET @sql = CONCAT('SELECT  designer_id, ', @sql, ' 
                    FROM    user_completed
                    GROUP  BY  designer_id');
      SELECT @sql;
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 2017-06-22
        • 1970-01-01
        • 2020-07-28
        • 2022-11-27
        相关资源
        最近更新 更多