1

我的表结构看起来像这样,我是这个领域的新手。我知道基本的查询。但这对我来说很复杂。请帮助我做到这一点。

表结构

  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
4

2 回答 2

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小提琴

对于每个客户,该PRODUCT列假设每个客户都有一个主要产品,然后按优先级顺序获得第一个产品。第二列仅采用优先级为 2 的位置,并使用字符串连接函数LISTAGG()将您的值连接在一起。

我强烈推荐 Rob van Wijk关于 KEEP 条款的博文

更标准的 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 的所有内容并聚合它们。

于 2013-07-06T09:27:33.270 回答
-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 
于 2013-07-06T09:56:10.853 回答