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

构建SQL查询实现无关联列销售/费用表关联及CanvasJS图表数据生成

解决CanvasJS图表的销售与费用对比SQL查询方案

我来帮你搞定这个查询!核心思路是分别汇总销售和费用的月度数据,再通过统一的yyyy-mm日期维度关联起来,这样就能得到图表需要的完整对比数据集了。

步骤拆解:

  • 先处理销售数据:关联发票主表[dbo].[Facturas]和明细表[dbo].[FacturasItems],按月份分组计算总销售额
  • 再处理费用数据:直接从费用表按月份分组计算总费用
  • 最后将两个数据集通过月度日期做全连接,补全缺失月份的0值,确保图表数据连续

完整SQL查询示例

WITH VentasMensuales AS (
    -- 第一步:汇总月度销售数据
    SELECT
        -- 生成标准yyyy-mm格式的月份
        CONCAT(DATEPART(YEAR, f.Fecha), '-', RIGHT('0' + CAST(DATEPART(MONTH, f.Fecha) AS VARCHAR(2)), 2)) AS Mes,
        SUM(fi.Importe) AS TotalVentas
    FROM
        [dbo].[Facturas] f
    INNER JOIN
        [dbo].[FacturasItems] fi ON f.IdFactura = fi.IdFactura  -- 关联发票主表和明细表
    GROUP BY
        DATEPART(YEAR, f.Fecha), DATEPART(MONTH, f.Fecha)  -- 按年、月分组
),
GastosMensuales AS (
    -- 第二步:汇总月度费用数据
    SELECT
        -- 同样生成标准yyyy-mm格式的月份(假设费用表日期字段叫FechaGasto)
        CONCAT(DATEPART(YEAR, g.FechaGasto), '-', RIGHT('0' + CAST(DATEPART(MONTH, g.FechaGasto) AS VARCHAR(2)), 2)) AS Mes,
        SUM(g.MontoGasto) AS TotalGastos  -- 假设费用金额字段叫MontoGasto
    FROM
        [dbo].[Gastos] g  -- 替换成你的实际费用表名
    GROUP BY
        DATEPART(YEAR, g.FechaGasto), DATEPART(MONTH, g.FechaGasto)
)
-- 第三步:关联两个数据集,补全缺失值
SELECT
    COALESCE(v.Mes, g.Mes) AS Mes,
    COALESCE(v.TotalVentas, 0) AS TotalVentas,
    COALESCE(g.TotalGastos, 0) AS TotalGastos
FROM
    VentasMensuales v
FULL OUTER JOIN
    GastosMensuales g ON v.Mes = g.Mes
ORDER BY
    Mes;  -- 按月份排序,保证图表顺序正确

关键细节说明:

  • 日期格式统一:用CONCAT+DATEPART的方式生成yyyy-mm字符串,确保两个表的日期维度完全匹配,避免因格式不一致导致关联失败
  • 全连接(FULL OUTER JOIN):确保不管某个月份只有销售还是只有费用,都能出现在结果里
  • COALESCE函数:把缺失的销售/费用值替换为0,这样CanvasJS绘制图表时不会出现断点或空值问题
  • 字段替换:记得把示例里的FechaGasto、MontoGasto、[dbo].[Gastos]换成你实际的费用表字段和表名

这个查询输出的结果直接就能作为CanvasJS的数据源,比如你可以把Mes作为X轴,TotalVentas和TotalGastos作为两个Y轴系列来对比。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:36:36