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