sql >> Database teknologi >  >> RDS >> Oracle

Drej på Oracle 10g

I Oracle 10g var der ingen PIVOT funktion, men du kan replikere den ved at bruge et aggregat med en 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;
 

Se SQL Fiddle with Demo

Hvis du har Oracle 11g+, kan du bruge PIVOT funktion:

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

Se SQL Fiddle with Demo

Hvis du har et ukendt antal værdier, der skal transformeres, så kan du oprette en procedure til at generere en dynamisk version af denne:

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;
/
 

derefter for at udføre koden:

variable x refcursor
exec dynamic_pivot(:x)
print x
 

Resultatet for alle versioner er det samme:

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

Rediger:Baseret på din kommentar, hvis du ønsker en Total felt, er den nemmeste måde at placere forespørgslen i en anden SELECT ligner dette:

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;
 

Se SQL Fiddle with Demo



  1. Deltag vs. underforespørgsel

  2. Din ultimative guide til SQL Join:CROSS JOIN – Del 3

  3. Oprettelse af en taltabel i MySQL

  4. Splitting Strings:Nu med mindre T-SQL