MySQL中的行到列,而无需事先知道行

时间:2019-05-20 21:49:35

标签: mysql sql pivot

我有一个如下所示的MySQL表:

 +---------+-------------+--------------+-------------+-------------+
| truckNo | excavatorId | times_loaded | litres      | litres/time |
+---------+-------------+--------------+-------------+-------------+
|  1      | 345         | 100          |          50 |         0.5 |
+---------+-------------+--------------+-------------+-------------+
|  1      | 275         | 34           |          50 |        1.47 |  
+---------+-------------+--------------+-------------+-------------+
|  2      | 275         | 100          |          50 |         0.5 |
+---------+-------------+--------------+-------------+-------------+

在此表中,挖掘机向任何卡车装载一次或多次。例如,挖掘机345在卡车上装载了1100次一些物料。但是卡车175也被挖掘机275装载了一些物料34次。现在,我想将每辆卡车的结果分组,因此在左列中,我可以看到不同的卡车,并将每台挖掘机作为新列,如下表所示:

 +--------+---------------------------------+---------------+--------------+
 |  Truck |     Excavators    | Total_loads |  Total litres |  Litres/load |
 +--------+-----------+-------+-------------+---------------+--------------+
 |        |    345    |  275  |             |               |              |
 +--------+-----------+-------+-------------+---------------+--------------+
 |    1   |    100    |  34   |   134       |     1.95      |    0.01      |
 +--------+-----------+-------+-------------+---------------+--------------+
 |    2   |           |  50   |   50        |     50        |    1         |
 +--------+-----------+-------+-------------+---------------+--------------+

问题是我永远都不知道表格中将有多少个挖掘机,所以我知道要制造多少列。 有什么办法吗? SQL是否可能?

编辑:每辆卡车均由任何挖掘机装载一次或多次。因此,在结果表中,例如1号卡车被挖掘机345装载了100次,而挖掘机275被装载了34次。在总载荷中,您看到来自所有/任何挖掘机的卡车1上的所有载荷,为134。升相同。升/负荷是结果表中总升/总负荷的除数

1 个答案:

答案 0 :(得分:0)

SQL查询始终使用列出的列生成结果表。如果您不知道要显示的列,则无法编写查询。

您的选择:

  1. 选择原始数据,然后根据您的应用或网站中的数据构建结果表。
  2. 首先选择挖掘机。然后,使用您的编程语言为这些挖掘机创建查询。
  3. 使用一列包含连接字符串的列。

这里是#3:

select
  truckno,
  group_concat('EX(', excavatorid, ')=', times_loaded order by excavatorid) as loads,
  sum(times_loaded) as total_loads,
  sum(litres) as total_litres,
  sum(litres) / sum(times_loaded) as litres_per_load
group by truckno
order by truckno;