2017-01-20 4 views
0

申し訳ありませんこれが尋ねられた場合、少し検索して、私の後ろのものと非常によく似たものを見つけられませんでした。複数のテーブルから複数の列を連結してくださいOracle

私は、Oracleを使用しており、複数のテーブルで複数の列にまたがって結果を集計しようとしています。

SELECT 
    LISTAGG(users.user_name, ',') WITHIN GROUP (ORDER BY users.user_name) 
FROM 
    users, 
    project_users 
WHERE 
    project_users.user_id = users.id 
    AND project_users.project_id = 123 
GROUP BY ID 
; 
:私はのようなクエリを使用して、単一のフィールドに特定のプロジェクトの出力であるユーザーを見つけることのようなことをやって、いくつかの成功のためにLISTAGGを使用することができました

Table: USERS 
-------------- 
ID | USER_NAME 
-------------- 
1 | Bob 
2 | Joe 
3 | Mary 

Table: PROJECT_USERS 
---------------------------------- 
USER_ID | PROJECT_ID | ACCESS_TYPE 
---------------------------------- 
1  |123   |8 
1  |456   |9 
1  |789   |10 
2  |123   |10 
2  |456   |9 
2  |789   |8 
3  |123   |9 
3  |456   |10 
3  |789   |10 

:下記の例

(謝罪構文は、これは私が住んで使用している正確なクエリではありませんので、理由のために、実際の構造とデータを不明瞭に、少し上記ではオフになっている場合) だろう出力:

Bob,Joe,Mary 

しかし、どのような出力はおそらくで区切られた2つの値を使用して、同様の形式で集計USERS.USER_NAMEとPROJECT_USERS.ACCESS_TYPEの組み合わせになるために私がしたい -

Bob-8,Joe-10,Mary-9 

私が得ることができ、個々の戻り

Bob-8 
Joe-9 
Mary-10 

そして、私はその後、それらの結果をLISTAGG可能性が期待していたが、残念ながらグラムすることができていないの返却

SELECT users.user_name || '-' || project_users.access_type... 

それは働くこと。先に述べたように、一時テーブルはすぐに出てきます。なぜなら、私が入りたくない理由があるからです。 FROMでSELECTを使用するとうまくいきませんが、最後にはサブクエリでこれを使用できるようにしたいと思いますが、私の理解(そして試した経験が限られています)は正しく反復されません各パス。たぶん私は間違っていますが、ちょうど間違っていました。

提案がありますか?

ありがとうございます!

+0

実際にあなたがリストでそうであるようにカンマ区切り値とは対照的に、あなたは、サブクエリでそれを使用しようとしている場合は、データを返すことが容易ではないでしょうか? – BobC

+0

@BobCが理想的ですが、これが使用されているレポートは、データを解析して別のものに再入力するために不器用に使用されています。それは本当に醜いですが、私は物事をどうやってやるのでしょうか。しかし、結局、私はサブクエリを使用してそれを使うために一行を返す必要があります。明らかに、適切なデータの完全性基準が犯されることはありません。 – CascadeOverflow

答えて

0

あなたはこのようなことをしているようです。あなたがなぜそれを望んでいるのかはわかりませんが(この場合)、あなたが求めていた方法を示しています。

with 
    users (id, user_name) as (
     select 1, 'Bob' from dual union all 
     select 2, 'Joe' from dual union all 
     select 3, 'Mary' from dual 
    ), 
    project_users (user_id, project_id, access_type) as (
     select 1, 123, 8 from dual union all 
     select 1, 456, 9 from dual union all 
     select 1, 789, 10 from dual union all 
     select 2, 123, 10 from dual union all 
     select 2, 456, 9 from dual union all 
     select 2, 789, 8 from dual union all 
     select 3, 123, 9 from dual union all 
     select 3, 456, 10 from dual union all 
     select 3, 789, 10 from dual 
    ) 
-- End of test data (not part of the SQL query). 
-- Query begins below this line. 
select project_id, 
     listagg(user_name || '-' || to_char(access_type), ',') 
      within group (order by user_name) as comma_sep_list 
from users u join project_users p on u.id = p.user_id 
group by project_id 
; 

PROJECT_ID COMMA_SEP_LIST 
---------- -------------------- 
     123 Bob-8,Joe-10,Mary-9 
     456 Bob-9,Joe-9,Mary-10 
     789 Bob-10,Joe-8,Mary-10 

3 rows selected. 
+0

そんなに大好き!これはトリックでした。それがTO_CHAR、暗黙のJOIN、またはGROUP BY ...であったかどうかは不明です。複数の場所では、私が何を試していたかを見ている可能性が高くなります。巨大な感謝! – CascadeOverflow

+1

'to_char()'を使わなくても逃げることができますが、暗黙的な変換は嫌いです。残りの部分は正しいかもしれません。乾杯! – mathguy

関連する問題