2017-10-11 58 views
0

我想将下面table1的数据分组到表2所示。我可以按列分组,但是我期望的输出是分组的!MySQL:如何按范围分组然后再分组?

Logic: assetScore => >=0 - <=25 -> LOW, > 25 - <= 60 -> MEDIUM' and > 60 -> HIGH status => 1 -> Backlog, 2 -> WIP and 3 -> closed

Table-1: 

+----+------------+--------+ 
| id | assetScore | status | 
+----+------------+--------+ 
| 1 |   10 |  1 | 
| 2 |   50 |  1 | 
| 3 |   32 |  3 | 
| 4 |   22 |  1 | 
| 5 |   12 |  2 | 
| 6 |   14 |  2 | 
| 7 |   18 |  3 | 
| 8 |   88 |  1 | 
| 9 |   65 |  3 | 
| 10 |   24 |  3 | 
| 11 |   44 |  2 | 
| 12 |   66 |  1 | 
| 13 |   22 |  3 | 
| 14 |   31 |  1 | 
| 15 |  36.5 |  3 | 
| 16 |   77 |  2 | 
+----+------------+--------+ 

Expected Result: 

+--------+---------+-----+--------+ 
|  | Backlog | WIP | Closed | 
+--------+---------+-----+--------+ 
| LOW |  2 | 2 |  3 | 
| MEDIUM |  2 | 1 |  2 | 
| HIGH |  2 | 1 |  1 | 
+--------+---------+-----+--------+ 

到目前为止,我有以下SQL(仅按assetScore或状态):

SELECT 
    t.RANGE, COUNT(*) 
FROM 
    (SELECT 
     CASE 
       WHEN assetScore BETWEEN 0 AND 25 THEN 'LOW' 
       WHEN assetScore BETWEEN 26 AND 60 THEN 'MEDIUM' 
       ELSE 'HIGH' 
      END AS 'RANGE' 
    FROM device) t 
GROUP BY t.RANGE; 

回答

2

,你可以简单地添加3例状态和总结相关值

SELECT 
    t.RANGE, sum(t.Backlog), sum(t.WIP), sum(t.Closed) 
FROM 
    (SELECT 
     CASE 
       WHEN assetScore BETWEEN 0 AND 25 THEN 'LOW' 
       WHEN assetScore BETWEEN 26 AND 60 THEN 'MEDIUM' 
       ELSE 'HIGH' 
      END AS 'RANGE', 
     CASE when status = 1 then 1 else 0 end as Backlog, 
     CASE when status = 2 then 1 else 0 end as WIP, 
     CASE when status = 3 then 1 else 0 end as Closed, 
    FROM device) t 
GROUP BY t.RANGE; 
2

使用case表达进行分类的范围,并在其上使用条件的聚集。

SELECT CASE WHEN assetScore BETWEEN 0 AND 25 THEN 'LOW' 
      WHEN assetScore BETWEEN 26 AND 60 THEN 'MEDIUM' 
      ELSE 'HIGH' 
     END AS `RANGE`, 
SUM(`status`=1) as backlog, 
SUM(`status`=2) as wip, 
SUM(`status`=3) as closed 
FROM device 
GROUP BY CASE WHEN assetScore BETWEEN 0 AND 25 THEN 'LOW' 
       WHEN assetScore BETWEEN 26 AND 60 THEN 'MEDIUM' 
     ELSE 'HIGH' END