В Oracle 10g нямаше PIVOT
функция, но можете да я репликирате с помощта на агрегат с CASE
:
изберете usr, sum(случай, когато tp ='T1' след това cnt else 0 край) T1, sum(случай, когато tp ='T2' след това cnt else 0 край) T2, sum(случай, когато tp =' T3' след това cnt else 0 край) T3 от tempgroup от usr;
Вижте SQL Fiddle с демонстрация
Ако имате Oracle 11g+, тогава можете да използвате PIVOT
функция:
изберете *от temppivot( sum(cnt) за tp в ('T1', 'T2', 'T3')) piv
Вижте SQL Fiddle с демонстрация
Ако имате неизвестен брой стойности за трансформиране, тогава можете да създадете процедура за генериране на динамична версия на това:
СЪЗДАВАЙТЕ ИЛИ ЗАМЕНЕТЕ процедурата dynamic_pivot(p_cursor in out sys_refcursor)като sql_query varchar2(1000) :='изберете usr'; започнете за x в (изберете различен tp от временния ред с 1) цикъл sql_query :=sql_query || ' , sum(случай, когато tp ='''||x.tp||''', тогава cnt else 0 край) като '||x.tp; dbms_output.put_line(sql_query); краен контур; sql_query :=sql_query || ' от временна група от usr'; отворете p_cursor за sql_query; край;/
след това, за да изпълните кода:
променлива x refcursorexec dynamic_pivot(:x)print x
Резултатът за всички версии е един и същ:
<предварителен код>| USR | T1 | T2 | T3 |----------------------------| 1 | 17 | 0 | 0 || 2 | 0 | 21 | 1 || 3 | 45 | 0 | 0 |
Редактиране:Въз основа на вашия коментар, ако искате Общо
поле, най-лесният начин е да поставите заявката вътре в друго SELECT
подобно на това:
изберете usr, T1 + T2 + T3 като Общо, T1, T2, T3from( изберете usr, sum(случай, когато tp ='T1', след това cnt else 0 край) T1, sum(случай, когато tp =' T2' след това cnt else 0 край) T2, sum(случай, когато tp ='T3', тогава cnt else 0 край) T3 от temp група от usr) src;
Вижте SQL Fiddle с демонстрация