如何使用 Union all 获得两列结果

Posted

技术标签:

【中文标题】如何使用 Union all 获得两列结果【英文标题】:How to get two columns result with Union all 【发布时间】:2018-09-03 15:38:30 【问题描述】:

我需要在结果上获取(Debe 和 Haber)列,我正在使用 Union All,但我总是只得到这两列之一。

这是我的查询:

(SELECT tblfacturas.id                 AS ID, 
        tblclientes.razonsocial        AS Cliente, 
        tblfacturas.fecha              AS Fecha, 
        tblfacturas.tipocomprobante    AS Tipo, 
        tblfacturas.nrofacturacompleto AS Numero, 
        tblfacturas.total              AS Debe 
 FROM   tblfacturas 
        left join tblclientes 
               ON tblclientes.id = tblfacturas.id_cliente 
 WHERE  tblclientes.razonsocial = 'S.A.') 
UNION ALL 
(SELECT tblrecibos.id                AS ID, 
        tblclientes.razonsocial      AS Cliente, 
        tblrecibos.fecha             AS Fecha, 
        'R'                          AS Tipo, 
        tblrecibos.nrorecibocompleto AS Numero, 
        tblrecibos.total             AS Haber 
 FROM   tblrecibos 
        left join tblclientes 
               ON tblclientes.id = tblrecibos.id_cliente 
 WHERE  tblclientes.razonsocial = 'S.A.') 
ORDER  BY fecha 

【问题讨论】:

您能提供一些示例数据并期待结果吗? 【参考方案1】:

在不存在的情况下添加 Debe 和 Haber 列需要 null,否则您会在同一列 (Debe) 中获得两个结果

  SELECT TblFacturas.id as ID
  , TblClientes.razonsocial as Cliente
  ,TblFacturas.fecha as Fecha
  ,TblFacturas.tipocomprobante as Tipo
  ,TblFacturas.nrofacturacompleto as Numero
  , TblFacturas.total as Debe 
  , null as Haber 
  FROM TblFacturas 
  left join TblClientes on TblClientes.id = TblFacturas.id_cliente 
  where TblClientes.razonsocial = 'S.A.' 
UNION ALL

  SELECT TblRecibos.id 
  , TblClientes.razonsocial 
  ,TblRecibos.fecha 
  , 'R' 
  ,TblRecibos.nrorecibocompleto 
  , null 
  , TblRecibos.total 
  FROM TblRecibos 
  left join TblClientes on TblClientes.id = TblRecibos.id_cliente 
  where TblClientes.razonsocial = 'S.A.'
  order by fecha

还有另一个建议 .. 您在 where 子句中的左连接中涉及列,如果左连接值不存在,则该列作为内部连接排除行,您应该 或移动 on 子句中的 where 条件(如果您还需要非 macthing 行)

  SELECT TblRecibos.id 
  , TblClientes.razonsocial 
  ,TblRecibos.fecha 
  , 'R' 
  ,TblRecibos.nrorecibocompleto 
  , null 
  , TblRecibos.total 
  FROM TblRecibos 
  left join TblClientes on TblClientes.id = TblRecibos.id_cliente 
    AND  TblClientes.razonsocial = 'S.A.' 

如果您只需要匹配的行,则使用内连接

  SELECT TblRecibos.id 
  , TblClientes.razonsocial 
  ,TblRecibos.fecha 
  , 'R' 
  ,TblRecibos.nrorecibocompleto 
  , null 
  , TblRecibos.total 
  FROM TblRecibos 
  INNER join TblClientes on TblClientes.id = TblRecibos.id_cliente 
    AND  TblClientes.razonsocial = 'S.A.' 

【讨论】:

您撤消我的编辑 :(。但是 nvm。关于您的其他建议,我相信LEFT JOIN 是要走的路。问题是表格顺序颠倒了。客户可能有也可能没有Facturas(账单)与 Recibos(收据)相同,您可以在 WHERE 中仅过滤带有 'S.A.' 的客户 别担心,我知道会发生这种情况。我认为 Inner Join 行不通,因为您可以在没有收据或账单的情况下拥有客户。

以上是关于如何使用 Union all 获得两列结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL UNION ALL 问题以获得正确的结果

如何将 UNION ALL 查询的结果显示为链接?

order by 和union all 如何共存

如何利用SQL随机显示一条数据?

union all和union的区别 怎么使用

MySQL UNION ALL 多重使用优化