【问题标题】: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