2013-07-06 122 views
1

我的表结构看起来像这样,我对这个字段是新的。我知道基本的查询,但对我来说很复杂。请帮助我做到这一点。Oracle字符串聚合

表结构

Customer   Product   piriority 
    10001   Main_product 1 
    10001   Sub_product1 2 
    10001   Sub_product2 2 
    10001   Sub_product3 2 
    10001   Sub_product4 2 
    10002   Main_product 1 
    10002   Sub_product1 2 
    10002   Sub_product2 2 

预期输出:

Customer  Main_Product Sub_product 
10001   Main_product Sub_product1,Sub_product2,Sub_product3,Sub_product4 
10002   Main_product Sub_product1,Sub_product2 

回答

5

我要去假设PRIORITY列始终为1时,有一个 “主产品” 永不1任何其他时间。从您的数据看来,每个客户只有一个“主要”产品。我会假设这是真的。如果不是,那么您应该有另一列来区分产品组。您可以简单地将其添加到下面。

的复杂性/高效性答案可能如下:

select customer 
    , max(product) keep (dense_rank first order by priority) as main_product 
    , listagg(case when priority = 2 then product end, ', ') 
     within group (order by product) as sub_product 
    from products 
group by customer 

SQL Fiddle

每客户中,PRODUCT列假定每一个客户都有一个主打产品,然后按优先级获得的第一个产品,为了。第二列仅取优先级为2的位置,并使用字符串连接函数LISTAGG()将您的值连接在一起。

我强烈推荐Rob van Wijk的blog post about the KEEP clause

更标准的SQL解决方案是这样的:

select a.customer, a.product as main_product 
    , listagg(b.product, ', ') within group (order by b.product) as sub_product 
    from products a 
    join products b 
    on a.customer = b.customer 
where a.priority = 1 
    and b.priority = 2 
group by a.customer, a.product 

即找到具有优先级1的一切,用它来生成你的两行,然后用2优先得到一切,聚合这些。

+0

有一次,我在做上面我得到了一个错误,它说有,你可以去一个极限。它大约4K长度。所以,确保你不会超过你的总字符长度。 to_clob转换也有限制。 ORA-01489:字符串连接的结果太长 01489. 00000 - “字符串连接的结果太长” *原因:字符串连接结果大于最大大小。 *操作:确保结果小于最大尺寸。 –

-1

试试这个,

select customer 
    , (select Product from yourtablename where pirority = 1) AS Main_Product 
    , (select wm_concat(Product) from yourTablename where pirority = 2) AS Sub_product  
    from yourtablename 
group by customer 
+1

当11g(OP正在使用)中存在LISTAGG()时,为什么要使用未记录的函数WM_CONCAT()?您还可以在此访问表格3次......由于您的第一次访问只为每位客户选择一行,因此您可以这样做:http://www.sqlfiddle.com/#!4/52137/4,而不是删除其中一个扫描。 – Ben

+0

本人测试。当数据类型为varchar2时,它的工作不能与数据类型nvarchar2一起使用 – Milton

+0

@Milton是什么意思?你测试了答案?它肯定会工作...或者你测试了其他东西吗? – Ben