将具有不同值的两行合并为一行

时间:2019-09-02 09:58:21

标签: mysql sql

在一行中获取两个记录

尝试通过子句分组,但未获得所需结果。

我有三个表:direccionpunto_suministror_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

最诚挚的问候。

3 个答案:

答案 0 :(得分:1)

您可以使用条件聚合。您只需要修改查询以使CASE周围包含诸如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;

答案 1 :(得分:1)

通常,使用LEFT JOIN进行聚合时,您希望按第一个表中的值进行聚合。

因为您使用的是LEFT JOIN,所以我猜想即使WHERE子句上没有匹配项,也要返回一行。

要确保一行,请使用不带GROUP BY的聚合查询:

SELECT MAX(d.id_direccion) as id_direccion,
       MAX(CASE WHEN sps.id_servicio_gas IS NOT NULL THEN ps.id_punto_suministro END) AS Gas,
       MAX(CASE WHEN sps.id_servicio_luz IS NOT NULL THEN ps.id_punto_suministro END) AS Luz
FROM direccion d LEFT JOIN
     punto_suministro ps
     ON d.id_direccion = ps.id_direccion LEFT JOIN
     r_servicio_punto_suministro sps
     ON ps.id_r_servicio_punto_suministro = sps.id_r_servicio_punto_suministro LEFT JOIN 
     servicio_gas sg
     ON sps.id_servicio_gas = sg.id_servicio_gas LEFT JOIN
     servicio_luz sl
     ON spm.id_servicio_luz = sl.id_servicio_luz
WHERE d.id_direccion = 10;

如果您知道数据中存在10,则可以使用GROUP BY d.id_direccion

答案 2 :(得分:0)

谢谢您的回答。 我终于用联接修复了它:

SELECT 
direccion.id_direccion,
cups_gas.id_punto_suministro AS Gas,
cups_luz.id_punto_suministro AS Luz
FROM
direccion
    INNER JOIN
(SELECT 
    cups,
        id_direccion,
        punto_suministro.id_punto_suministro,
        atr,
        ca,
        fecha_fin
FROM
    punto_suministro
INNER JOIN r_servicio_punto_suministro ON r_servicio_punto_suministro.id_r_servicio_punto_suministro = punto_suministro.id_r_servicio_punto_suministro
INNER JOIN servicio_gas ON r_servicio_punto_suministro.id_servicio_gas = servicio_gas.id_servicio_gas
INNER JOIN r_contrato_punto_suministro ON punto_suministro.id_punto_suministro = r_contrato_punto_suministro.id_punto_suministro
INNER JOIN contrato ON r_contrato_punto_suministro.id_contrato = contrato.id_contrato
INNER JOIN r_servicio_contrato ON contrato.id_contrato = r_servicio_contrato.id_contrato
INNER JOIN servicio ON r_servicio_contrato.id_servicio = servicio.id_servicio) cups_gas ON direccion.id_direccion = cups_gas.id_direccion
    INNER JOIN
(SELECT 
    cups,
        id_direccion,
        punto_suministro.id_punto_suministro,
        atr,
        ca,
        fecha_fin
FROM
    punto_suministro
INNER JOIN r_servicio_punto_suministro ON r_servicio_punto_suministro.id_r_servicio_punto_suministro = punto_suministro.id_r_servicio_punto_suministro
INNER JOIN servicio_luz ON r_servicio_punto_suministro.id_servicio_luz = servicio_luz.id_servicio_luz
INNER JOIN r_contrato_punto_suministro ON punto_suministro.id_punto_suministro = r_contrato_punto_suministro.id_punto_suministro
INNER JOIN contrato ON r_contrato_punto_suministro.id_contrato = contrato.id_contrato
INNER JOIN r_servicio_contrato ON contrato.id_contrato = r_servicio_contrato.id_contrato
INNER JOIN servicio ON r_servicio_contrato.id_servicio = servicio.id_servicio) cups_luz ON direccion.id_direccion = cups_luz.id_direccion
WHERE
direccion.id_direccion = 10;

最诚挚的问候。