我有一个表名为 COM24 的表
我必须选择Y,如果匹配的HYPERLINK
与movetype='C'
匹配,反之亦然,对于相同的 COM24 movetype='D'
,poliref
,{{1 }},inrctyp
,inrcref
,csntype
。
我想要做的是如下所示。 我试图解释我需要的逻辑,我知道以下内容会有错误
duedate
所以基本上要求是"计算带有值的' C'"""""""" - "带有值的移动类型计数' D'"对于相同的itrno
,SELECT '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
,poliref
,inrctyp
,inrcref
,csntype
为0然后返回Y
答案 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;
/
如果这或多或少是您想要的,请告诉我。