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
相关产品推荐
相关产品推荐

