Sql - 将行转换为列

Sql - Convert rows to cloums

我是 sql Pivot 的新手。我已经 table 调用了 "devices",内容是这样的。

+------------------------------+------------------
| device_id    | serial_number | imei            |
+------------------------------+------------------
| A1yLCM4xe9cn | PIE7JHgo8rLwG | 767523638130820 |
| A1yLCM4xe9cn | PIE7JHgo8rLwG | 100509490452499 |
| OJndw9C5X5I4 | 8lZ0YkPHjv5qA | 893567359155395 |
| OJndw9C5X5I4 | 8lZ0YkPHjv5qA | 336707619575525 |
| RIaKTBPEFQlc | CYGKQLSluJIRq | 269331663151346 |

我正在尝试获取这样的 select 查询

+------------------------------+----------------------------------
| device_id    | serial_number | imei1           | imei2         |
+------------------------------+----------------------------------
| A1yLCM4xe9cn | PIE7JHgo8rLwG | 767523638130820 | 100509490452499
| OJndw9C5X5I4 | 8lZ0YkPHjv5qA | 893567359155395 | 336707619575525
| RIaKTBPEFQlc | CYGKQLSluJIRq | 269331663151346 | NULL

我能够获得硬编码值。是否可以将行动态转换为列?

如果每个 device_id/serieal_no 总是有两个 imei 值:

select device_id, serial_number, min(imei) as imei1, max(imei) as imei2
from tablename
group by device_id, serial_number

如果每个 device_id/serieal_no 有一个或两个 imei 值:

select device_id, serial_number, min(imei) as imei1,
       case when count(*) > 1 then max(imei) end as imei2
from tablename
group by device_id, serial_number

select device_id,serial_number,GROUP_CONCAT(imei) as imeis from devices group by device_id,serial_number;

这不是一个精确的解决方案,但可能对您有所帮助。 其他解决方案可能是自连接,但不可能同时在两个字段上。