有条件地限制行结果

问题描述 投票:1回答:1

我需要在查询中添加一些条件逻辑,如果一行有相同的BUSINESS_UNITVOUCHER_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 sameBUSINESS_UNITandVOUCHER_ID`的行。

基本上发生的事情是,有两笔付款被应用于同一凭证/业务单位,但如果它不包含WTHD_RULE的'PA1',我不想要额外的行(有重复的行)

enter image description here

结果将包括来自第一个查询的数据以及第二个查询中的第二行。有没有办法在不使用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

格式化得更好:enter image description here

sql sql-server-2014
1个回答
0
投票

您从示例数据中删除了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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.