1

オラクル10g

私の要件は次のとおりです。

  1. 各部門を選択
  2. 部門ごとに個々のアイテムを選択します (各アイテムは独自の行を取得しますが、重複する場合は結合します)
  3. 明確な部門とアイテムごとに各色を選択します (重複する場合は、最も小さい番号を選択してください)。
  4. 個別の部門およびアイテムごとに各ユーザーを選択します (複数の場合は集計)

DBデータ

Department    Item_List                  Color       User
Research      Item 1                    1. Blue      John
Research      Item 1;Item 2             2. Blue      Mike
Research      Item 1;Item 2; Item 3     1. Red       Steve
Research      Item 2                    1. Purple    John
Research      Item 1;Item 4             2. Red       Bill
Ops           Item 1;Item 2             3. Silver    John
Ops           Item 1;Item 3             3. Silver    Mike
Ops           Item 4                    4. Yellow    Mark

予想された結果

Department    Item_List         Color         User
Research        Item 1         1. Blue       John, Mike
Research        Item 2         1. Blue       Mike
Research        Item 1         1. Red        Steve, Bill
Research        Item 2         1. Red        Steve
Research        Item 3         1. Red        Steve
Research        Item 2         1. Purple     John
Research        Item 4         1. Red        Bill
Ops             Item 1         3. Silver     John, Mike
Ops             Item 2         3. Silver     John
Ops             Item 3         3 Silver      Mike
Ops             Item 4         4. Yellow     Mark

次の SQL を使用していますが、機能していません。

with data as 
(
select
DEPARTMENT, 
ITEM_LIST,
(length(ITEM_LIST)-length(replace(ITEM_LIST,';','')))+1 cnt,
MIN(Color) as Color,
wm_concat(USER) as USER
from DataBase_Table
Group by 
DEPARTMENT, 
ITEM_LIST
)
select 
DEPARTMENT
ITEM_LIST,
Color,
User
from
(
select distinct 
DEPARTMENT,
ltrim(regexp_substr(ITEM_LIST,'[^;]+',1,level)) ITEM_LIST, 
Color,
level,
User
from data
connect by level <= cnt
order by DEPARTMENT
)
;
4

1 に答える 1

0
with 
   t1 as (
      select 
         department, 
         trim(regexp_substr(item_list, '[^;]+', 1, occ)) as item,
         to_number(regexp_substr(color, '^\d+')) as color_no, 
         regexp_replace(color, '^\d+(.*)$', '\1') as color_name, 
         user_
      from 
         (
            select level as occ from dual 
            connect by level <= (select max(length(item_list)) from source)
         ), 
         source
      where regexp_substr(item_list, '[^;]+', 1, occ) is not null
   )
select 
   department, 
   item,
   color, 
   listagg(user_, ',') within group (order by user_)
from
   (
      select 
         min(color_no)||color_name as color, 
         color_name
      from t1
      group by color_name
   ) 
   natural join t1 
group by 
   department, 
   item,
   color
order by 1 desc, 2, 3

SQLフィドル


wm_concat(distinct user_)
Oracle 10では、代わりに使用する必要があります
listagg(user_, ',') within group (order by user_)

于 2013-02-08T23:10:12.220 に答える