使用Sybase SQL,我想找到满足某些简单要求(例如DEBITCREDIT == 'D')的所有记录,并且满足以下要求:这些记录的名义值之和必须等于300。
以下是屏幕截图作为示例:
在屏幕截图中,我的 select 语句的目的是选择以黄色突出显示的 RECORD_ID,即 RECORD_ID 2 和 RECORD_ID 4。(请注意,RECORD_ID 2 的 NOMINAL_VALUE + RECORD_ID 4 的 NOMINAL_VALUE = 300。)
如果不是 RECORD 6,以下代码将实现此目的:
create table RECORDS
(RECORD_ID int
,SECURITIES_ID char(1)
,DEBITCREDIT char(1)
,NOMINAL_VALUE int
,BOOKING_ID int
)
go
insert RECORDS values (1,'A','C',100,10)
insert RECORDS values (2,'B','D',100,20)
insert RECORDS values (3,'B','C',100,30)
insert RECORDS values (4,'B','D',200,40)
insert RECORDS values (5,'C','D', 50,50)
insert RECORDS values (6,'B','D', 1,60)
go
select RECORD_ID,
BOOKING_ID
from RECORDS
where SECURITIES_ID = 'B'
and DEBITCREDIT = 'D'
group by SECURITIES_ID,
DEBITCREDIT
having sum(NOMINAL_VALUE) = 300
order by 1,2
go
由于 RECORD 6,所有(SECURITIES_ID = 'B' 且 DEBITCREDIT = 'D')条目的总和(NOMINAL_VALUE)为 301(而不是 300)。
如何选择满足以下所有条件的所有条目(即使这些条件仅适用于子集):SECURITIES_ID = 'B'、DEBITCREDIT = 'D' 且 sum(NOMINAL_VALUE) = 300
P.S.:这个问题是以下问题的后续问题:sybase sql:选择 XYZ 列中的值之和等于某个特定值的记录
这应该使用窗口函数来完成
WITH CTE as(
select RECORD_ID,
BOOKING_ID,
SUM(NOMINAL_VALUE) OVER(ORDER BY RECORD_ID) sumes
from RECORDS
where SECURITIES_ID = 'B'
and DEBITCREDIT = 'D')
select RECORD_ID,
BOOKING_ID FROM CTE WHERE sumes >= 300
记录_ID | BOOKING_ID |
---|---|
4 | 40 |
6 | 60 |