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

SQL中不同表字段相减实现:计算用户剩余可用假期天数

计算SQL中跨表数值差值的解决方案

看起来你是想按用户维度计算剩余假期,但之前的查询没做用户级的聚合,所以才会只显示单条申请的天数而不是汇总后的差值。我来帮你一步步解决这个问题:

第一步:明确表结构假设(如果和你的实际结构不符,调整字段名即可)

  • sec_users:存储用户基础信息,核心字段应该是用户ID(比如user_id)和年度总假期天数(比如total_annual_vacation)
  • solicitud:存储假期申请记录,核心字段是用户ID(user_id)和单条申请的天数(比如requested_days)

第二步:先聚合用户的总已申请天数

首先需要把每个用户的所有申请天数加总,这一步要用SUM()和GROUP BY来实现:

SELECT 
    user_id,
    SUM(requested_days) AS total_requested_days
FROM solicitud
GROUP BY user_id;

第三步:关联用户表计算剩余天数

把上面的聚合结果和sec_users表关联,用LEFT JOIN确保哪怕没有申请过假期的用户也能被显示(避免被过滤掉),然后用COALESCE处理total_requested_days为NULL的情况(也就是没有申请的用户,已申请天数记为0):

SELECT 
    u.user_id,
    u.total_annual_vacation,
    COALESCE(s.total_requested_days, 0) AS total_requested_days,
    u.total_annual_vacation - COALESCE(s.total_requested_days, 0) AS remaining_vacation_days
FROM sec_users u
LEFT JOIN (
    SELECT 
        user_id,
        SUM(requested_days) AS total_requested_days
    FROM solicitud
    GROUP BY user_id
) s ON u.user_id = s.user_id;

为什么之前的查询没得到预期结果?

很大概率是你直接把两张表做了关联但没有聚合,比如类似这样的错误写法:

-- 错误示例:没有聚合,会返回每条申请记录,而不是用户级汇总
SELECT 
    u.user_id,
    u.total_annual_vacation - s.requested_days AS remaining_vacation_days
FROM sec_users u
JOIN solicitud s ON u.user_id = s.user_id;

这种写法会把每条申请和用户表关联,返回的是每条申请对应的剩余天数(而不是用户总的剩余天数),所以才会不符合预期。

如果你的表字段名和我假设的不一样,只需要把字段名替换成你实际的字段即可~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:19:44