Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Obróć na Oracle 10g

W Oracle 10g nie było PIVOT funkcji, ale możesz ją zreplikować za pomocą agregatu z CASE :

select usr,
  sum(case when tp ='T1' then cnt else 0 end) T1,
  sum(case when tp ='T2' then cnt else 0 end) T2,
  sum(case when tp ='T3' then cnt else 0 end) T3
from temp
group by usr;

Zobacz SQL Fiddle z demonstracją

Jeśli masz Oracle 11g+, możesz użyć PIVOT funkcja:

select *
from temp
pivot
(
  sum(cnt)
  for tp in ('T1', 'T2', 'T3')
) piv

Zobacz SQL Fiddle z demonstracją

Jeśli masz nieznaną liczbę wartości do przekształcenia, możesz utworzyć procedurę generującą dynamiczną wersję tego:

CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
as
    sql_query varchar2(1000) := 'select usr ';

    begin
        for x in (select distinct tp from temp order by 1)
        loop
            sql_query := sql_query ||
              ' , sum(case when tp = '''||x.tp||''' then cnt else 0 end) as '||x.tp;

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from temp group by usr';

        open p_cursor for sql_query;
    end;
/

następnie wykonać kod:

variable x refcursor
exec dynamic_pivot(:x)
print x

Wynik dla wszystkich wersji jest taki sam:

| USR | T1 | T2 | T3 |
----------------------
|   1 | 17 |  0 |  0 |
|   2 |  0 | 21 |  1 |
|   3 | 45 |  0 |  0 |

Edytuj:na podstawie Twojego komentarza, jeśli chcesz otrzymać Total pola, najłatwiejszym sposobem jest umieszczenie zapytania wewnątrz innego SELECT podobny do tego:

select usr,
  T1 + T2 + T3 as Total,
  T1,
  T2,
  T3
from
(
  select usr,
    sum(case when tp ='T1' then cnt else 0 end) T1,
    sum(case when tp ='T2' then cnt else 0 end) T2,
    sum(case when tp ='T3' then cnt else 0 end) T3
  from temp
  group by usr
) src;

Zobacz SQL Fiddle z demonstracją



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać szerokość i długość z sdo_geometry w Oracle?

  2. Przykład Oracle Dynamic SQL do wstawiania rekordu przy użyciu DBMS_SQL

  3. ORA-12728:nieprawidłowy zakres w wyrażeniu regularnym

  4. Wyświetl listę wszystkich wyzwalaczy w bazie danych Oracle

  5. pobierz nazwę tabeli z kolumny dla klauzuli from