有条件地限制行结果

时间:2018-09-06 15:48:54

标签: sql sql-server-2014

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

从本质上讲,正在发生两次付款应用于同一凭单/业务部门的情况,但是我不希望附加行(其中有重复项)不包含{{1}的“ PA1” }

enter image description here

结果将包括来自第一个查询的数据以及第二个查询中的第二行。是否有一种无需使用CTE即可完成此操作的方法?

编辑:

或者,有没有一种方法可以进行自我连接并为WTHD_RULE创建一个新列,其中WTHD_RULE等于'PA1'?

编辑2:

WTHD_AMT

有了这个样本/模式,我想要的输出将是这样的:

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');

下面的格式更好: enter image description here

1 个答案:

答案 0 :(得分:0)

您从示例数据中删除了WTHD_RULE ...但是如果存在,则可以使用窗口函数来执行此操作。另外,在示例数据中,由于PK不能包含重复项,因此PRIMARY KEY无效。

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
相关问题