Oracle
 sql >> база данни >  >> RDS >> Oracle

Pivot на Oracle 10g

В 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 с демонстрация



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Получаване на списък с всички таблици в Oracle?

  2. Ускорете операциите за групово вмъкване с NHibernate

  3. Как да излекувам причината за изключението при хибернация, възникнало IllegalArgumentException при извикване на сетера?

  4. Oracle копира данни в друга таблица

  5. Oracle Ace Промени