Sql 如何基于其他列值显示值的计数
我有一张表,上面有以下数据Sql 如何基于其他列值显示值的计数,sql,oracle,Sql,Oracle,我有一张表,上面有以下数据 SQL> select * from mate2; A_CD S_ID E_CD S_E S_NE E_IND ---------- ---------- ---------- ----- ----- - 100 1 3 A J Y 100 1 3 B A N 100
SQL> select * from mate2;
A_CD S_ID E_CD S_E S_NE E_IND
---------- ---------- ---------- ----- ----- -
100 1 3 A J Y
100 1 3 B A N
100 1 3 A D
200 2 3 A C Y
200 2 3 D C
300 3 3 B N Y
300 3 3 N N
我需要通过一张CD和一张S_E,S_NE作为字母代码获得不同S_E,S_NE组的计数,条件如下:
当E_CD=3且E_IND=N时,取S_NE的值
当E_CD=3且E_IND=Y时,取S_E的值
当E_CD=3且E_IND为空时,取S_NE的值,并将E_IND显示为N
当E_CD=3且E_IND为null时,取S_E的值,并将E_IND显示为Y
输出应该如下所示。L_C是S_E,S_NE的计数
A_CD L_C COUNT E_IND
---- --- ----- -----
100 A 3 Y
100 D 1 N
200 A 1 Y
200 D 1 Y
200 C 1 N
300 B 1 Y
300 N 1 Y
300 N 1 N
下面是用于测试的示例表创建和数据
create table Mate2(a_cd number(5),S_ID NUMBER, E_CD number(10), S_E varchar2(5), S_NE varchar2(5), E_IND CHAR(1 byte));
insert into Mate2 values (100,1,3,'A','J','Y');
insert into Mate2 values (100,1,3,'B','A','N');
insert into Mate2(a_cd,S_ID,E_CD,S_E,S_NE) values (100,1,3,'A','D');
insert into Mate2 values (200,2,3,'A','C','Y');
insert into Mate2(a_cd,S_ID,E_CD,S_E,S_NE) values (200,2,3,'D','C');
insert into Mate2 values (300,3,3,'B','N','Y');
insert into Mate2(a_cd,S_ID,E_CD,S_E,S_NE) values (300,3,3,'N','N');
不确定这是否是您要查找的,似乎您的记录总数与您提供的所需输出不匹配,否则请尝试以下操作:
SELECT ABC.a_cd,ABC.L_C,COUNT(*)as COUNT,ABC.E_IND FROM (
select A_CD, case when E_CD = 3 and E_IND = 'N' then S_NE
when E_CD = 3 and E_IND = 'Y' then S_E
when E_CD = 3 and E_IND is null then S_NE
when E_CD = 3 and E_IND is null then S_E
end as L_C,
case when E_CD = 3 and E_IND is null then 'N'
when E_CD = 3 and E_IND is not null then 'Y'
else E_IND
end as E_IND
FROM Mate2) as ABC
GROUP BY ABC.a_cd, ABC.L_C,ABC.E_IND
你必须先分离E_IND,然后它变得简单
WITH data1 as (
SELECT A_CD, E_CD, S_E, S_NE,
CASE when E_CD = 3 and E_IND is null then 'N'
else E_IND
END as E_IND
FROM mate2
UNION ALL
SELECT A_CD, E_CD, S_E, S_NE, 'Y' E_IND
FROM mate2
WHERE E_CD = 3 and E_IND is null
)
SELECT A_CD, L_C, COUNT(*) as COUNT, E_IND FROM (
SELECT A_CD,
CASE when E_CD = 3 and E_IND = 'N' then S_NE
when E_CD = 3 and E_IND = 'Y' then S_E
else 'what_to_do_with_these'
END as L_C,
E_IND
FROM data1
)
GROUP BY A_CD, L_C, E_IND
order by A_CD, E_IND desc, L_C;
我添加了一条E_CD=2的额外记录,以显示没有给出指令的情况。我猜您的环境中有这样的数据,因为条件包括E_CD
输出是
A_CD L_C COUNT E_IND
---- --- ----- -----
100 what_to_do_with_these 1 -
100 A 2 Y
100 A 1 N
100 D 1 N
200 A 1 Y
200 D 1 Y
200 C 1 N
300 B 1 Y
300 N 1 Y
300 N 1 N
按照您的规则,给定的结果行100 A 3 Y不正确,因为一个A来自E_IND=N您是否尝试解决此问题?发布您的代码。您是如何获得CD 100的总L_C 4和CD 200的总L_C 3以及CD 300的总L_C 3的?3和4之间的条件差异是什么?当E_IND为Y时,我们将计算S_E的值,当E_IND为N时,计算S_NE的值。当E_IND为null时,这两个值分别为。在这种情况下,对于a_cd 100,E_IND是Y,我们取S_E的值,得到a-1,E_IND是N,然后取S_NE的值,它是a,当E_IND为null时,我们取S_E和S_NE a,并且我假设在第四个条件中不是null,而不是null,当与第三个条件比较时,这将导致冲突。需求非常明确,并且OP的意思是空的。他想在e_ind为null的行中分叉,本质上是将这些行计数两次,一次好像e_ind是“Y”,另一次好像是“N”。
A_CD L_C COUNT E_IND
---- --- ----- -----
100 what_to_do_with_these 1 -
100 A 2 Y
100 A 1 N
100 D 1 N
200 A 1 Y
200 D 1 Y
200 C 1 N
300 B 1 Y
300 N 1 Y
300 N 1 N