获取表中列中的第二大值

时间:2021-04-30 02:43:57

标签: pivot subquery distinct listagg

那里,

我有一张看起来像这样的表(FICAPRD.T_FHB_RPT_MSTR_PA_BP):

CERT_LIST_ID PRODUCT_ID CERTIFICATION_NUMBER EFFECTIVE_DATE
62 8379 F00021-05-000-02 01-APR-22
63 8381 F00021-05-000-02 01-APR-22
64 8383 F00021-05-000-02 01-APR-22
65 8374 F00021-06-000-02 01-APR-22
66 8379 F00021-06-000-02 01-APR-21
67 8381 F00021-06-000-02 01-APR-21
68 8383 F00021-06-000-02 01-APR-21
24 8377 F00037-08-000-01 26-AUG-19
2 8371 F00037-01-000-01 26-AUG-19
22 8377 F00037-06-000-01 26-AUG-19
21 8377 F00037-05-000-01 26-AUG-18
20 8376 F00037-04-000-01 26-AUG-16
19 8376 F00037-03-000-01 26-AUG-16

我需要获得不同的certificate_number并将它们排列成这样(输出被缩短仅用于说明): 年龄性别 'F00021-01-000-01' 'F00021-01-000-02' 'F00021-02-000-01' 'F00021-02-000-02'
0 米 2 7 0 0
1 M 0 1 0 0
2 M 0 1 0 0
3 M 0 0 0 1

一开始,我用这个代码来获取certification_number

select LISTAGG(distinct''''||certification_number||'''', ',') within group (order by certification_number) from FICAPRD.T_FHB_RPT_MSTR_PA_BP

和输出是这样的: 'F00021-01-000-01'、'F00021-01-000-02'、'F00021-02-000-01'、'F00021-02-000-02' ...

然后我把结果放到这段代码中:

select 
* from (
select AGE, SEX, CERTIFICATION_NUMBER from FICAPRD.T_FHB_RPT_MSTR_PA_BP)
pivot (
count (*) for CERTIFICATION_NUMBER in (
'F00021-01-000-01','F00021-01-000-02','F00021-02-000-01','F00021-02-000-02'
)) order by SEX desc, AGE asc
;

最终结果给了我我想要的,但我需要做这两个步骤。现在我想用这段代码一步一步来,但它不起作用:

with dummy as(
Select Rownum -1 r
From dual
Connect By Rownum <= 101
)
select r, a.* from dummy d
left outer join 
(
select * from (
select age , SEX, CERTIFICATION_NUMBER from FICAPRD.T_FHB_RPT_MSTR_PA_BP)
pivot (
count (CERTIFICATION_NUMBER ) for CERTIFICATION_NUMBER in (
select LISTAGG(distinct''''||certification_number||'''', ',') within group (order by certification_number) from FICAPRD.T_FHB_RPT_MSTR_PA_BP
)
)
) a on d.r= a.age
order by d.r
;

然后我尝试使用这种方式:

with dummy as(
Select Rownum -1 r
From dual
Connect By Rownum <= 101
)
select r, a.* from dummy d
left outer join 
(
select * from (
select age , SEX, CERTIFICATION_NUMBER from FICAPRD.T_FHB_RPT_MSTR_PA_BP)
pivot (
count (CERTIFICATION_NUMBER ) for CERTIFICATION_NUMBER in (
SELECT  RTRIM(
           REGEXP_REPLACE(listagg (distinct''''||certification_number||'''', ',')
                     WITHIN GROUP (ORDER BY CERTIFICATION_NUMBER),
             '([^,]+)(,\1)+', '\1'),  ','
            )
from FICAPRD.T_FHB_RPT_MSTR_PA_BP
)
)
) a on d.r= a.age
order by d.r
;

但它也不起作用,但方法返回: ORA-00936: 缺少表达式 00936. 00000 - “缺少表达”

感谢任何帮助解决我的问题,谢谢。

0 个答案:

没有答案