2017-10-11 56 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