如何将MySQL表的唯一行转换为列作为查询

时间:2017-08-08 06:21:31

标签: mysql

数据:

我有以下MySQL表:

Timestamp           | MachineID |  Arrival_Timestamp  | CobID | Data |
--------------------+-----------+---------------------+-------+------| 
2017-07-22 20:03:07 |   1217    | 2017-08-08 04:46:02 | C237  | 10   | 
2017-07-22 20:03:08 |   1217    | 2017-08-08 04:47:03 | C237  | 11   | 
2017-07-22 20:03:09 |   1217    | 2017-08-08 04:48:04 | C237  | 12   | 
2017-07-22 20:07:17 |   1218    | 2017-08-08 04:49:05 | C234  | 20   | 
2017-07-22 20:05:19 |   1224    | 2017-08-08 04:50:06 | C239  | 30   | 
2017-07-22 20:06:17 |   1216    | 2017-08-08 04:50:07 | C237  | 40   | 
2017-07-22 20:08:07 |   1224    | 2017-08-08 04:50:08 | C234  | 50   | 
2017-07-22 20:09:14 |   1216    | 2017-08-08 04:55:09 | C239  | 60   |
2017-07-22 20:09:14 |   1216    | 2017-08-08 04:55:10 | C239  | 61   | 
2017-07-22 20:09:17 |   1216    | 2017-08-08 04:55:12 | C239  | 63   | 
2017-07-22 20:09:18 |   1216    | 2017-08-08 04:56:02 | C239  | 63   | 
2017-07-22 20:09:19 |   1216    | 2017-08-08 04:56:03 | C239  | 63   | 
2017-07-22 20:09:34 |   1217    | 2017-08-08 04:56:21 | C234  | 70   | 
2017-07-22 20:09:56 |   1224    | 2017-08-08 04:57:23 | C237  | 80   | 
2017-07-22 20:09:58 |   1299    | 2017-08-08 04:57:43 | C239  | 90   | 
2017-07-22 20:09:59 |   1218    | 2017-08-08 04:57:55 | C239  | 100  | 
2017-07-22 20:10:04 |   1218    | 2017-08-08 04:58:03 | C234  | 110  | 
2017-07-22 20:10:17 |   1217    | 2017-08-08 04:58:04 | C239  | 120  | 

在此表中,我想计算所有唯一CobID的所有唯一MachineID的所有条目/行。

目标:

我想写一个查询,输出将是:

     | 1216 | 1217 | 1218 | 1224 | 1299 |
-----+------+------+------+------+------|
C234 | 0    | 1    | 1    | 2    | 0    |
C237 | 1    | 3    | 0    | 1    | 0    |
C239 | 5    | 1    | 1    | 1    | 1    |

因此,此查询,我可以查看MachineID 1216并说明0C234个条目,5条目C239 }}

到目前为止我做了什么:

我尝试了以下查询,它可以获得我想要的内容,但不是我想要的确切格式:

data_query = "SELECT `MachineID`, `CobID`, COUNT(*) FROM `my_table` WHERE `Arrival_Timestamp`  between \'{}\' AND \'{}\'  GROUP BY `CobID`, `MachineID` ORDER BY `CobID` ASC".format(
        start_date, end_date)

问题:

如何更改查询以使其达到上述格式?

1 个答案:

答案 0 :(得分:0)

尝试使用仅包含SUM 1的CASE,如果它是correc列,如果您有更多的机器类型,则可以添加更多列:

data_query="SELECT CobID,
       SUM(case 
        when MachineID='1216' then 1  
        else 0 
        end) as '1216', 
       SUM(case 
        when MachineID='1217' then 1  
        else 0 
        end) as '1217',
       SUM(case 
        when MachineID='1218' then 1  
        else 0 
        end) as '1218', 
       SUM(case 
        when MachineID='1224' then 1  
        else 0 
        end) as '1224', 
       SUM(case 
        when MachineID='1299' then 1  
        else 0 
        end) as '1299'
FROM my_table
WHERE `Arrival_Timestamp`  between \'{}\' AND \'{}\'
group by CobID
ORDER BY `CobID` ASC".format(start_date, end_date)