2013-07-06 87 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