如果使用聚合函数,如果计数(colmn1)与值A和B的差值为0,则选择Y if column

时间:2015-12-29 09:19:51

标签: sql oracle plsql oracle11g plsqldeveloper

我有一个表名为 COM24 的表 我必须选择Y,如果匹配的HYPERLINKmovetype='C'匹配,反之亦然,对于相同的 COM24 movetype='D'poliref,{{1 }},inrctypinrcrefcsntype

我想要做的是如下所示。 我试图解释我需要的逻辑,我知道以下内容会有错误

duedate

所以基本上要求是"计算带有值的' C'"""""""" - "带有值的移动类型计数' D'"对于相同的itrnoSELECT 'Y' FROM COM24 c2 HAVING ( (COUNT(c2.movetype) = 'C') - (COUNT(c2.movetype='D') ) ) =0 AND c2.csnstat!= 90 GROUP BY c2.poliref , c2.inrctyp , c2.inrcref , c2.csntype , c2.duedate , c2.itrno polirefinrctypinrcrefcsntype为0然后返回Y

2 个答案:

答案 0 :(得分:0)

使用sum,您可以实现结果,还有很多其他方法可以实现。

SELECT CASE
           WHEN SUM(CASE
                        WHEN c2.movetype = 'C' THEN
                         1
                        WHEN c2.movetype = 'D' THEN
                         -1
                        ELSE
                         0
                    END) = 0 THEN
            'Y'
           ELSE
            'N'
       END
  FROM com24 c2
 WHERE c2.csnstat != 90
 GROUP BY c2.poliref,
          c2.inrctyp,
          c2.inrcref,
          c2.csntype,
          c2.duedate,
          c2.itrno

<强>更新 如果你想要游标中的值,你可以像这样编写代码

CURSOR C1 AS
WITH t_table AS (
    SELECT c2.poliref,
           c2.inrctyp,
           c2.inrcref,
           c2.csntype,
           c2.duedate,
           c2.itrno,
           CASE
               WHEN SUM(CASE
                        WHEN c2.movetype = 'C' THEN
                         1
                        WHEN c2.movetype = 'D' THEN
                         -1
                        ELSE
                         0
                    END) = 0 THEN
            'Y'
           ELSE
            'N'
           END AS flag
      FROM com24 c2
     WHERE c2.csnstat != 90
     GROUP BY c2.poliref,
              c2.inrctyp,
              c2.inrcref,
              c2.csntype,
              c2.duedate,
              c2.itrno)
SELECT *
  FROM t_table       
 WHERE flag = 'Y';
  

您的要求可能略有不同,但您可以获得一些想法   从如何编写代码的答案。

答案 1 :(得分:0)

你提到过你正在使用游标。我会做这样的事情(尚未测试) -

DECLARE
 cursor c1 is 
   select c2.poliref, c2.inrctyp, c2.inrcref, c2.csntype, c2.duedate, c2.itrno
   from com24 c2
   where c2.csnstat != 90
   and c2.movetype = 'C'
   minus
   select c2.poliref, c2.inrctyp, c2.inrcref, c2.csntype, c2.duedate, c2.itrno
   from com24 c2
   where c2.csnstat != 90
   and c2.movetype = 'D';

BEGIN
  open c1;
  fetch c1;
  if c1%notfound then
    /* Handle 'Y' return.. e.g: */
    dbms_output.put_line('Y');
  end if;
END;
/

如果这或多或少是您想要的,请告诉我。