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

Sybase SQL中如何筛选满足条件且合计值等于指定值的记录?

Sybase SQL 筛选总和符合条件的记录

你之前的写法报错,核心原因是聚合函数(如SUM)不能直接放在WHERE子句中——WHERE用于筛选单条记录的行级条件,而聚合函数是对一组记录的计算结果,必须通过分组筛选或窗口函数来实现需求。以下是两种可行的实现方式:

方案1:子查询关联(兼容低版本Sybase)

先通过子查询找出满足总和条件的分组(示例按BOOKING_ID分组,若需按其他字段分组,替换即可),再关联回原表获取具体记录:

SELECT r.RECORD_ID, r.BOOKING_ID
FROM RECORDS r
INNER JOIN (
    -- 筛选出NOMINAL_VALUE总和为300的BOOKING_ID
    SELECT BOOKING_ID
    FROM RECORDS
    WHERE SECURITIES_ID = 'B' AND DEBITCREDIT = 'D'
    GROUP BY BOOKING_ID
    HAVING SUM(NOMINAL_VALUE) = 300
) g ON r.BOOKING_ID = g.BOOKING_ID
WHERE r.SECURITIES_ID = 'B' AND r.DEBITCREDIT = 'D'

方案2:窗口函数(适合Sybase ASE 16及以上版本)

利用窗口函数直接计算分组内的总和,再筛选总和符合条件的行,写法更简洁:

SELECT RECORD_ID, BOOKING_ID
FROM (
    SELECT 
        RECORD_ID,
        BOOKING_ID,
        -- 按BOOKING_ID分组计算NOMINAL_VALUE总和
        SUM(NOMINAL_VALUE) OVER(PARTITION BY BOOKING_ID) AS total_nominal
    FROM RECORDS
    WHERE SECURITIES_ID = 'B' AND DEBITCREDIT = 'D'
) t
WHERE total_nominal = 300

特殊场景补充

如果你的需求是:所有SECURITIES_ID='B'且DEBITCREDIT='D'的记录总和恰好为300时,才取出这些记录,可使用以下写法:

SELECT RECORD_ID, BOOKING_ID
FROM RECORDS
WHERE SECURITIES_ID = 'B' AND DEBITCREDIT = 'D'
AND (
    SELECT SUM(NOMINAL_VALUE) 
    FROM RECORDS 
    WHERE SECURITIES_ID = 'B' AND DEBITCREDIT = 'D'
) = 300

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:15:30