首页 > 解决方案 > 将具有不同值的两行连接在一行中

问题描述

在一行中获取两条记录

尝试的子句 group by 未获得所需的结果。

我有三个表:direccion, punto_suministro, r_servicio_punto_suministro

id_direccion         others_fields
     10                   XXX        
     10                   YYY  


id_punto_suministro            id_r_servicio_punto_suministro 
       6                            1   
       7                            2   


id_r_servicio_punto_suministro     id_servicio_gas    id_servicio_luz
 1                                   6                 null   
 2                                  null                7

询问:

SELECT 
    punto_suministro.id_direccion,
CASE WHEN  r_servicio_punto_suministro.id_servicio_gas IS NOT NULL THEN punto_suministro.id_punto_suministro END AS Gas,
CASE WHEN  r_servicio_punto_suministro.id_servicio_luz IS NOT NULL THEN punto_suministro.id_punto_suministro END AS Luz
FROM 
    direccion 
    LEFT JOIN punto_suministro ON direccion.id_direccion = punto_suministro.id_direccion 
    LEFT JOIN r_servicio_punto_suministro ON punto_suministro.id_r_servicio_punto_suministro = r_servicio_punto_suministro.id_r_servicio_punto_suministro  
    LEFT JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas 
    LEFT JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
WHERE direccion.id_direccion = 10;

查询返回两行:

 id_direccion     Gas      Luz
     10           6        null
     10           null     7

我想要一条记录中的结果:

 id_direccion     Gas      Luz
     10           6        7

标签: mysqlsql

解决方案


您可以使用条件聚合。你只需要修改你的查询,CASE用一个聚合函数包围 s ,例如MAX()(MIN()同样可以完成这项工作),并GROUP BY在末尾添加一个子句:

SELECT 
    punto_suministro.id_direccion,
    MAX(CASE WHEN  r_servicio_punto_suministro.id_servicio_gas IS NOT NULL THEN punto_suministro.id_punto_suministro END) AS Gas,
    MAX(CASE WHEN  r_servicio_punto_suministro.id_servicio_luz IS NOT NULL THEN punto_suministro.id_punto_suministro END) AS Luz
FROM 
    direccion 
    LEFT JOIN punto_suministro ON direccion.id_direccion = punto_suministro.id_direccion 
    LEFT JOIN r_servicio_punto_suministro ON punto_suministro.id_r_servicio_punto_suministro = r_servicio_punto_suministro.id_r_servicio_punto_suministro  
    LEFT JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas 
    LEFT JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
WHERE direccion.id_direccion = 10
GROUP BY punto_suministro.id_direccion;

推荐阅读