我需要在查询中添加一些条件逻辑,如果一行有相同的BUSINESS_UNIT
和VOUCHER_ID
然后只输出WTHD_RULE
等于'PA1'的行我不能应用标准(WTHD_RULE = 'PA1')
普遍(对整个查询)因为我仍然希望获得不包含WTHD_RULE = 'PA1'. I just want to filter the results using this criteria when there are rows with the same
BUSINESS_UNITand
VOUCHER_ID`的行。
基本上发生的事情是,有两笔付款被应用于同一凭证/业务单位,但如果它不包含WTHD_RULE
的'PA1',我不想要额外的行(有重复的行)
结果将包括来自第一个查询的数据以及第二个查询中的第二行。有没有办法在不使用CTE的情况下实现这一目标?
编辑:
或者有一种方法可以自我连接并为WTHD_AMT
创建一个新列,其中WTHD_RULE等于'PA1'?
编辑2:
CREATE TABLE mytable(
BUSINESS_UNIT INTEGER NOT NULL
,VOUCHER_ID INTEGER NOT NULL
,PYMNT_CNT INTEGER NOT NULL
,PYMNT_ID INTEGER
,PYMNT_TYPE VARCHAR(1) NOT NULL
,PAID_AMT NUMERIC(7,3) NOT NULL
,PYMNT_GROSS_AMT NUMERIC(8,3) NOT NULL
,DUE_DT DATE NOT NULL
,PRIMARY KEY(BUSINESS_UNIT,VOUCHER_ID)
);
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026130,2,NULL,'W',0.000,30.700,'2018-06-29 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026130,1,0000121315,'R',969.300,969.300,'2018-06-29 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026131,1,NULL,'R',0.000,0.000,'2018-06-30 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026132,1,NULL,'R',0.000,1000.000,'2010-06-30 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026133,1,0000121312,'R',100.000,100.000,'2018-06-28 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026134,1,0000121309,'R',100.000,100.000,'2018-06-28 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026135,1,0000121308,'R',100.000,100.000,'2018-08-02 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026136,2,NULL,'W',0.000,3.070,'2018-08-24 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026136,1,0000121314,'R',96.930,96.930,'2018-08-24 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026137,2,NULL,'W',0.000,30.700,'2018-09-04 00:00:00.000');
INSERT INTO mytable(BUSINESS_UNIT,VOUCHER_ID,PYMNT_CNT,PYMNT_ID,PYMNT_TYPE,PAID_AMT,PYMNT_GROSS_AMT,DUE_DT) VALUES (50000,00026137,1,0000121316,'R',969.300,969.300,'2018-09-04 00:00:00.000');
使用此示例/模式,我想要的输出将是这样的:
BUSINESS_UNIT VOUCHER_ID PYMNT_CNT PYMNT_ID PYMNT_TYPE PAID_AMT PYMNT_GROSS_AMT DUE_DT
50000 26130 1 121315 R 969.3 969.3 6/29/2018
50000 26131 1 R 0 0 6/30/2018
50000 26132 1 R 0 1000 6/30/2010
50000 26133 1 121312 R 100 100 6/28/2018
50000 26134 1 121309 R 100 100 6/28/2018
50000 26135 1 121308 R 100 100 8/2/2018
50000 26136 1 121314 R 96.93 96.93 8/24/2018
50000 26137 1 121316 R 969.3 969.3 9/4/2018
您从示例数据中删除了WTHD_RULE
...但如果它存在,您将使用窗口函数来执行此操作。此外,在您的示例数据中,您的PRIMARY KEY
无效,因为PK不能包含重复项。
select
*
FROM(
select
*
,RN = row_number() over (partition by BUSINESS_UNIT, VOUCHER_ID order by case when WTHD_RULE = 'PA1' then 1 else 2 end)
from
myTable
) x
where x.RN = 1