2

SQLの新機能であり、複数のテーブルにまたがる多数の結合を使用していくつかのデータをプルするクエリがあります。

サンプルデータ:

PERSON_NAME FUNCTION_NAME  FUNCTION_ID  FUNCTION_GROUP

Bob         View Result    1            Editor
Bob         Edit Result    4            Editor
Bob         Delete Result  3            Editor
Bob         Email Result   8            Editor
Mary        Print Letter   45           Admin
Mary        Grant Access   37           Admin

関数にはIDがあり、function_groupsには多数の関数があります。データをクエリしたいので、上記の例のように表示されるのではなく、次のようになります。

PERSON_NAME FUNCTION_NAME                             FUNCTION_ID     FUNCTION_GROUP

Bob         View Result,Edit Result, Delete Result   1,4,3,8          Editor
Mary        Print Letter,Grant Access                 45,37           Admin

「ボブはエディターに属しています。エディターには次の機能があります」という結果は、最初の例ではなく、次の行が返されます。

ユニークまたは明確なキーワードが私を助けることができると思うのは正しいですか?ありがとう!

編集:今コードで

select staff_member.person_name, function.function_name,staff_group_function.function_id, staff_group.function_group_name
 from staff_member
 inner join staff_group
 on staff_group.staff_group_id=staff_group_member.staff_group_id
 inner join staff_group_function
 on staff_group_function.staff_group_id=staff_group_member.staff_group_id
 inner join function
 on function.function_id=staff_group_function.function_group_name
4

3 に答える 3

4

いいえ。必要なのはLISTAGG()、Oracle11g2を使用している場合です。これはあなたの質問かもしれません:

SELECT person_name,
       LISTAGG(function_name, ', ') WITHIN GROUP (ORDER BY 1) function_name,
       LISTAGG(function_id,   ', ') WITHIN GROUP (ORDER BY 1) function_id,
       function_group
FROM my_table
GROUP BY person_name, function_group

または(最新のコメントに続いて):

SELECT person_name,
       LISTAGG(function_name,  ', ') WITHIN GROUP (ORDER BY 1) function_name,
       LISTAGG(function_id,    ', ') WITHIN GROUP (ORDER BY 1) function_id,
       LISTAGG(function_group, ', ') WITHIN GROUP (ORDER BY 1) function_group
FROM my_table
GROUP BY person_name

11g2より前のバージョンの場合、この興味深い記事に解決策があります。

http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php

于 2012-04-11T14:37:31.170 に答える
2

UNIQUE結果のグループ化や集計とDISTINCTは何の関係もありません。残りの結果をグループ化するには、独自の集計関数を適用する必要がGROUP BY PERSON_NAMEあります。FUNCTION_GROUP

この記事では、を使用してOracleの集計関数を介してコンマ文字列と連結する方法を正確に説明しますLISTAGG

于 2012-04-11T14:42:41.763 に答える
1

それでは10g以下のように動作します

with tab as (
 select 'Bob' PERSON_NAME,'View Result' FUNCTION_NAME,'1' FUNCTION_ID,'Editor' FUNCTION_GROUP      from dual
union all
select 'Bob' PERSON_NAME,'Edit Result' FUNCTION_NAME,'4' FUNCTION_ID,'Editor' FUNCTION_GROUP from    dual
union all
select 'Bob' PERSON_NAME ,'Delete Result'FUNCTION_NAME,'3' FUNCTION_ID,'Editor' FUNCTION_GROUP from dual
union all
select 'Bob' PERSON_NAME,'Email Result' FUNCTION_NAME,'8' FUNCTION_ID,'Editor' FUNCTION_GROUP from dual
union all
select 'Mary' PERSON_NAME,'Print Letter' FUNCTION_NAME,'45' FUNCTION_ID,'Admin' FUNCTION_GROUP from dual
union all
select 'Mary' PERSON_NAME , 'Grant Access' FUNCTION_NAME ,'37' FUNCTION_ID,'Admin' FUNCTION_GROUP from dual
 )
select person_name
      ,wm_concat(function_name) function_name
      ,wm_concat(function_id) function_id
      ,function_group
 from tab
 group by person_name,function_group

出力 出力

于 2012-04-11T17:31:43.653 に答える