2016-10-20 3 views
0

테이블이 2 개 있습니다. 테이블 사용자는 아래와 같은 사용자 정보를 저장합니다.동적으로 열을 행으로 작성 (Oracle)

**user_id  user_name** 
1   naveen 
2   richard 
3   reddy 

다른 테이블 User_activity. 사용자 계획의 세부 사항을 저장합니다.

**user_id  Activity date** 
1   holiday 1-aug-2016 
2   working 1-aug-2016 
3   training 1-aug-2016 
1   working 2-aug-2016 
2   working 2-aug-2016 
3   working 2-aug-2016 

이제 아래 형식으로 보고서를 만들어야합니다. 저를 위해 검색어를 쓰도록 도와주세요.

**Date   naveen  Richard  reddy** 
1-aug-2016 holiday  working  training 
2-aug-2016 working  working  working 
+0

을 지금까지 뭐 해봤 어? 3 명 이상의 사용자가 있다면 어떻게 될까요? 다양한 수의 열로 쿼리를 작성 하시겠습니까? – Aleksej

+0

피벗 기능을 통해 작업하고 있습니다. 그러나 사용자가 3 명 이상 없다면 나는 만들 수 없다고 말한 것처럼 최선의 해결책을 찾고 있습니다. –

+1

가변 개수의 열이있는 결과를 반환하는 일반 SQL을 작성할 수 없습니다. 동적 SQL을 빌드하고 실행하면 다양한 수의 컬럼이 제공되지만 그 결과를 처리하는 방법은 무엇입니까? 다른 방법으로, 값의 연결을 포함하는 단일 열을 사용하여 결과를 만들 수 있으며 일부 구분 기호 – Aleksej

답변

0

그렇게 할 방법이 없습니다. (PIVOT_XML 제외).

짧은 이야기 : 쿼리를 실행하면 Oracle에서 열과 해당 데이터 형식에 대한 설명을 보냅니다. 실제로 모든 데이터에 닿기도 전에.

오라클은 생산자 - 소비자 원칙을 사용하기 때문에 데이터가 평가 될 때 클라이언트로 전송되므로 결과 집합은 서버 측에서 버퍼링되지 않습니다.

귀하의 요청이이 원칙에 위배됩니다. 컬럼의 수가 데이터 컨텐츠에 의존했다면 오라클은 즉시 결과 세트 매개 변수를 변경해야합니다. 이는 불가능합니다.

PIVOT_XML은 하나의 CLOB 열만 생성하므로 예외입니다.

0

데이터 연결이 포함 된 단일 열을 사용하여 출력물을 구축하면 약간 다른 방식으로 시도 할 수 있습니다. 모든 사용자가 매일 정확하게 활성이 있다고 가정하면, 당신은 그런 식으로 뭔가를 시도 할 수 있습니다 :

with users(user_id, user_name) as 
(
    select 1, 'naveen' from dual union all 
    select 2, 'richard' from dual union all 
    select 3, 'reddy' from dual 
), 
user_activity(user_id, Activity, activity_date) as 
(
    select 1, 'holiday' , date '2016-08-01' from dual union all 
    select 2, 'working' , date '2016-08-01' from dual union all 
    select 3, 'training' , date '2016-08-01' from dual union all 
    select 1, 'working' , date '2016-08-02' from dual union all 
    select 2, 'working' , date '2016-08-02' from dual union all 
    select 3, 'working' , date '2016-08-02' from dual 
) 
select rpad('Date', 16, ' ') || ',' || listagg(rpad(user_name, 16, ' '), ',') within group (order by user_id) 
from users 
union all 
select rpad(to_char(activity_date, 'yyyy-mm-dd'),16, ' ') || ',' || listagg(rpad(activity, 16, ' '), ',') within group (order by user_id) 
from users 
     inner join user_activity using(user_id) 
group by activity_date 

결과를 :

RPAD('DATE',16,'')||','||LISTAGG(RPAD(USER_NAME,16,''),',')WITHINGROUP(ORDERBYUS 
-------------------------------------------------------------------------------- 
Date   ,naveen   ,richard   ,reddy 
2016-08-01  ,holiday   ,working   ,training 
2016-08-02  ,working   ,working   ,working 

나는 네 번째 사람이 추가하는 경우 :

RPAD('DATE',16,'')||','||LISTAGG(RPAD(USER_NAME,16,''),',')WITHINGROUP(ORDERBYUSER_ID) 
---------------------------------------------------------------------------------------------------- 
Date   ,naveen   ,richard   ,reddy   ,Fourth Man 
2016-08-01  ,holiday   ,working   ,training  ,training 
2016-08-02  ,working   ,working   ,working   ,working