【问题标题】:MySQL row totals per value每个值的 MySQL 行总数
【发布时间】:2020-09-30 09:11:23
【问题描述】:

MySQL表结构如下:

| id | company_id | project_id | status |
|  1 |          1 |          1 |  draft |
|  2 |          1 |          1 |   done |
|  3 |          1 |          1 |    wip |
|  4 |          1 |          2 |  draft |

我想在表上运行单个查询并为单个 company_id 获得类似的结果:

| project_id | draft | wip | done | total |
|          1 |     1 |   1 |    1 |     3 |
|          2 |     1 |   0 |    0 |     1 |

表格可能有 >.5M 行

【问题讨论】:

    标签: mysql sql count sum pivot


    【解决方案1】:

    使用条件聚合:

    select project_id, 
        sum(status = 'draft') draft,
        sum(status = 'wip') wip,
        sum(status = 'done') done,
        count(*) total
    from mytable
    group by project_id
    

    【讨论】:

      【解决方案2】:

      您可以明确地选择所有 status 案例,然后动态旋转以获得所有 status 值,即使新插入的值不是当前值:

      SET @sql = NULL;
      
      SELECT GROUP_CONCAT(
                   CONCAT(
                          'SUM( status =''', status, ''' ) AS ',status
                          )
             )
        INTO @sql
        FROM ( SELECT DISTINCT status
                 FROM t 
             ) t;
      
      SET @sql = CONCAT('SELECT company_id, project_id,',@sql,',COUNT(*) AS total'
                         ' FROM t
                          GROUP BY company_id, project_id'); 
      
      
      PREPARE stmt FROM @sql;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      

      Demo

      【讨论】:

        猜你喜欢
        • 2021-05-13
        • 2020-05-24
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多