2017-03-21 41 views
1

在Oracle中,我遇到了一个问题,该问题从我正在使用的表中获取聚合值。我正在提供下面的示例。但从总体角度来看,我甚至不知道从哪里开始。我想我需要结合使用案例和结合,但我不知道如何对它进行说明。使用Group By和ListAgg获取聚合信息

我的表看起来像这样:

Record# Value 
    111111 KA 
    111111 RA 
    111111 HA 
    111112 KA 
    111113 RA 
    111114 HA 
    111114 RA 

期望的结果。我想获得的就是在哪里记录数:

# Records only have KA only. 
    # Records only have RA only. 
    # Records only have RH only. 
    # Records only have HA only. 
    # Records only have KA and RA. 
    # Records only have KA and RH. 
    # Records only have KA, RA and RH. 
    and etc. 

我有那些“价值”的数量有限,但我有超过100万的记录那里,我需要了解这些记录组成。

我会为它创建一个小提琴,但它似乎目前已被打破。

create table myTable(record varchar2(100), value varchar2(100)); 
insert into myTable(record ,value) values(111111,'KA'); 
insert into myTable(record ,value) values(111111,'RA'); 
insert into myTable(record ,value) values(111111,'HA'); 
insert into myTable(record ,value) values(111112,'KA'); 
insert into myTable(record ,value) values(111113,'RA'); 
insert into myTable(record ,value) values(111114,'HA'); 
insert into myTable(record ,value) values(111114,'RA'); 

编辑*使用的是什么@戈登 - Linoff建议后,

select valuelist, count(*) as cnt 
from (select record, listagg(value, ',') within group (order by value) as valuelist, count(*) as cnt 
     from mytable 
     group by record 
    ) r 
group by valuelist 
order by cnt, valuelist; 

我得到了一个混合的结果,看上去更像是这个

KA 2 
RA 3 
HA 2 

而不是

KA, RA, HA 2 
KA 1 
RA 1 
HA, RA 1 
+1

请不要使用不适用于您的问题 –

+0

对不起标签,我刚提交后一个问题,并相信它是标签问题。我为此道歉。 – Amoner

回答

2

您可以通过组合fi来做到这一点使用listagg()然后由结果汇总视场:

select valuelist, count(*) as cnt 
from (select record, listagg(value, ',') within group (order by value) as valuelist, count(*) as cnt 
     from mytable 
     group by record 
    ) r 
group by valuelist 
order by cnt, valuelist; 
+0

这很有道理!谢谢!我会在一分钟内尝试,并会更新结果。 – Amoner

+0

当使用LISTAGG,我得到 记录编号 111111 KA,KA 111111 RA 111111 HA 而不是 111111 KA,KA,RA,HA 甚至更​​好 111111 KA,RA,HA – Amoner

+0

发现我自己的问题,我有一个额外的组:) – Amoner