同一个 MariaDB 表中的销售和采购

问题描述 投票:0回答:2

我有一个车辆表,其中包含购买日期的字段,我可以使用

检索信息
SELECT
    MONTH(vehiculo.fecha_compra) mes,
    SUM(vehiculo.precio_compra) importe,
    COUNT(*) cantidad
FROM
    vehiculo
WHERE
    YEAR(vehiculo.fecha_compra) = '2024'
GROUP BY
    MONTH(vehiculo.fecha_compra);

我还有第二个表,其中包含有关销售的数据,可以像这样查询:

SELECT
    MONTH(propuesta.fecha) mes,
    SUM(propuesta.cotizacion) importe,
    COUNT(*) cantidad
FROM
    propuesta
WHERE
    estado = "Vendido" AND YEAR(propuesta.fecha) = '2024'
GROUP BY
    MONTH(propuesta.fecha)

结果如下:

我会组合两个表以获得类似的内容:

主要问题是可能有几个月有采购,但没有销售。

mysql union
2个回答
0
投票

通过一个非常快速的答案(如果给出更详细的答案或发现重复的答案,我将删除它):

您可以先生成 12 个月的列表(以确保您拥有全部)。然后您可以将两个“虚拟表”加入其中。

因此,例如(伪 SQL):

SELECT 
  T1.mes,
  T2.importe_compras,
  T2.cantidad_compras,
  T3.importe_ventas,
  T3.cantidad_ventas
FROM
(
  -- A query that provides the month numbers 1-12 here
) T1
LEFT JOIN 
(
  -- The First Query Here
) T2
ON T1.mes = T2.Mes
LEFT JOIN
(
  -- The Second Query Here
) T3
ON T1.mes = T3.mes

0
投票

您需要一个完整的外部连接。然而,MySQL [仍然]没有实现它们。您可以通过将左连接与反半连接联合来模拟它。你可以这样做:

with
purchases as (
  -- first query here
),
sales as (
  -- second query here
)
select p.mes, 
  p.importe as importe_compras, p.cantidad as cantidad_compras,
  s.importe as importe_ventas, s.cantidad as cantidad_ventas
from purchases p
left join sales s on s.mes = p.mes
union all
select s.mes, null, null, s.importe, s.cantidad
from sales s
left join purchases p on p.mes = s.mes
where p.mes is null
© www.soinside.com 2019 - 2024. All rights reserved.