2016-03-02 50 views
1

我是新增的sql Pivot。我有一个名为“设备”的表格,内容如下。Sql - 将行转换为cloums

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

我试图得到这样

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

我能得到硬编码值的选择查询。是否可以将行动态转换为列?

+0

是否有某种方式来订购半重复记录? –

+1

每个device_id/serieal_no总是有两个imei值? – jarlh

+0

并非总是如此。也只能有一个imei。 @jarlh – user1437251

回答

2

如果有总是每DEVICE_ID/serieal_no 2个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 
+0

谢谢@jarlh。完美的作品。 – user1437251

1

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

这是不是一个确切的解决方案,但可以帮助你 其他解决方案可以是自加入,但不能同时在两个区域中进行。