2014-10-28 7 views
0

У меня есть некоторые данные в таблице, которую я хочу транспонировать с помощью SQL. Вот примеры данных.Транспонирование таблицы с использованием Oracle SQL

create table test_pivot(
Name varchar2(100), 
DeptA varchar2(50), 
DeptB varchar2(50), 
DeptC varchar2(50), 
DeptD varchar2(50) 
); 

insert all 
into test_pivot(Name,DeptA,DeptB,DeptC,DeptD) 
values('Asfakul','Y',NULL,NULL,NULL) 
into test_pivot(Name,DeptA,DeptB,DeptC,DeptD) 
values('Debmalya',NULL,'Y',NULL,NULL) 
into test_pivot(Name,DeptA,DeptB,DeptC,DeptD) 
values('Ranjan',NULL,NULL,'Y',NULL) 
into test_pivot(Name,DeptA,DeptB,DeptC,DeptD) 
values('santanu',NULL,NULL,NULL,'Y') 
select 1 from dual; 

Я хочу, чтобы данные, которые будут отображаться, как показано ниже ..

enter image description here

Я имею трудное время вычисляя его. пожалуйста, дай мне знать.

+2

Вы знаете, что хотите развернуть, так как далеко у вас есть с оператором поворота? Или вы все еще на более старой версии, которая не поддерживает это? –

+0

Я думаю, что это операция UNPIVOT. Я все еще пытаюсь. – redsoxlost

ответ

1

Если ваша версия базы данных поддерживает точку поворота и не имеет значения, вы можете использовать ее. Смотрите ниже запрос, я думаю, это должно помочь вам ..

SELECT * 
    FROM( SELECT * 
      FROM test_pivot 
     UNPIVOT (Check_val FOR DEPT IN (DEPTA, DEPTB, DEPTC, DEPTD)) 
    ) 
PIVOT(MAX(check_val) FOR NAME IN ('Asfakul' AS Asfakul, 
            'Debmalya' AS Debmalya, 
            'Ranjan' AS Ranjan, 
            'santanu' AS santanu)) 
ORDER BY dept; 

+0

Спасибо. Но можем ли мы сделать то же самое с использованием sql Only? – redsoxlost

+0

Конечно, можно ... но полезное использование поворота полезно. –

+0

Как мы можем реализовать, используя тот же sql .. Можете ли вы руководствоваться – redsoxlost

2

Здесь ЗЕЬЕСТ без PIVOT и UNPIVOT. Как вы можете видеть, это намного сложнее:

select dept, 
     nvl(max(case when name = 'Asfakul' then dept_val end), 'N') as Asfakul, 
     nvl(max(case when name = 'Debmalya' then dept_val end), 'N') as Debmalya, 
     nvl(max(case when name = 'Ranjan' then dept_val end), 'N') as Ranjan, 
     nvl(max(case when name = 'santanu' then dept_val end), 'N') as santanu 
    from(select name, 
       dept, 
       case when dept = 'depta' then depta 
        when dept = 'deptb' then deptb 
        when dept = 'deptc' then deptc 
        when dept = 'deptd' then deptd 
       end dept_val 
     from test_pivot 
     join(select 'depta' as dept from dual union all 
       select 'deptb' as dept from dual union all 
       select 'deptc' as dept from dual union all 
       select 'deptd' as dept from dual 
      ) 
      on 1 = 1 
    ) 
group 
    by dept 
order 
    by dept 
Смежные вопросы