如何使用 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 获得两列结果的主要内容,如果未能解决你的问题,请参考以下文章