You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多表关联查询需求:合并detalle_contrato与detalle_tradicional查询结果

合并两张表的统计结果解决方案

我来帮你搞定这个合并查询的需求!核心思路是先分别对两张表按ID_CONTRATO和NOM_VARIEDAD做分组统计,再通过这两个字段将结果关联起来,确保所有品种的统计数据都能完整显示(包括只在其中一张表存在的品种)。

方案1:支持全外连接(FULL OUTER JOIN)的数据库(如PostgreSQL、SQL Server、Oracle)

这种方式最直接,能同时保留两张表中所有匹配和不匹配的记录:

SELECT
    COALESCE(c.ID_CONTRATO, t.ID_CONTRATO) AS ID_CONTRATO,
    COALESCE(c.NOM_VARIEDAD, t.NOM_VARIEDAD) AS NOM_VARIEDAD,
    COALESCE(c.CANTIDAD, 0) AS CANTIDAD,
    COALESCE(t.CANTIDAD_D, 0) AS CANTIDAD_D
FROM
    (
        -- 从detalle_contrato统计CANTIDAD总和
        SELECT
            ID_CONTRATO,
            NOM_VARIEDAD,
            SUM(CANTIDAD) AS CANTIDAD
        FROM detalle_contrato
        WHERE ID_CONTRATO = '$ID'
          AND TIPO_VARIEDAD = 'TRADICIONAL'
        GROUP BY ID_CONTRATO, NOM_VARIEDAD
    ) c
FULL OUTER JOIN
    (
        -- 从detalle_tradicional统计CANTIDAD_D总和
        SELECT
            ID_CONTRATO,
            NOM_VARIEDAD,
            SUM(CANTIDAD_D) AS CANTIDAD_D
        FROM detalle_tradicional
        WHERE ID_CONTRATO = '$ID'
        GROUP BY ID_CONTRATO, NOM_VARIEDAD
    ) t
ON c.ID_CONTRATO = t.ID_CONTRATO
AND c.NOM_VARIEDAD = t.NOM_VARIEDAD;

方案2:不支持全外连接的数据库(如MySQL)

如果你的数据库不支持FULL OUTER JOIN,可以用UNION ALL先把两个子查询的结果合并,再重新分组聚合:

SELECT
    ID_CONTRATO,
    NOM_VARIEDAD,
    SUM(CANTIDAD) AS CANTIDAD,
    SUM(CANTIDAD_D) AS CANTIDAD_D
FROM
    (
        -- 第一个子查询的结果,CANTIDAD_D设为0
        SELECT
            ID_CONTRATO,
            NOM_VARIEDAD,
            SUM(CANTIDAD) AS CANTIDAD,
            0 AS CANTIDAD_D
        FROM detalle_contrato
        WHERE ID_CONTRATO = '$ID'
          AND TIPO_VARIEDAD = 'TRADICIONAL'
        GROUP BY ID_CONTRATO, NOM_VARIEDAD
        
        UNION ALL
        
        -- 第二个子查询的结果,CANTIDAD设为0
        SELECT
            ID_CONTRATO,
            NOM_VARIEDAD,
            0 AS CANTIDAD,
            SUM(CANTIDAD_D) AS CANTIDAD_D
        FROM detalle_tradicional
        WHERE ID_CONTRATO = '$ID'
        GROUP BY ID_CONTRATO, NOM_VARIEDAD
    ) combined
GROUP BY ID_CONTRATO, NOM_VARIEDAD;

关键说明

  • COALESCE函数用来处理关联时可能出现的NULL值,把没有统计到的数值转为0,避免结果出现空值。
  • 两个方案都严格筛选指定$ID的记录,并且按品种分组统计总和。
  • 如果业务中两张表的NOM_VARIEDAD是完全对应的,也可以用LEFT JOIN或RIGHT JOIN代替全外连接,但全外连接更稳妥,能覆盖所有可能的情况。

内容的提问来源于stack exchange,提问作者Diego Valenzuela

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:23:36