We’re working on producing our data as a relational database/set and as a row-column dataset (so that the users of the data can use which format suits them best). Here’s a simplified table of our data:
drop table parameter_test; create table parameter_test ( site_id VARCHAR(30), parameter VARCHAR(30), value NUMBER, method VARCHAR(30) ); insert into parameter_test values ('site1', 'ANC', 10.1,'Gran 1952'); insert into parameter_test values('site2', 'ANC', 21.8, 'Gran 1952'); insert into parameter_test values('site1', 'NO3', 2.1, 'EPA 1983'); insert into parameter_test values('site2', 'NO3', 7.2, 'EPA 1983');
I know how to pivot for the values, but this doesn’t put the method into a specific parameter_column (ANC_method or NO3 method):
drop table parameter_pivot_test; create table parameter_pivot_test AS (select * from (select site_id, parameter_number, parameter from parameter_test) pivot (sum(parameter_number) for parameter in ( 'ANC' ANC, 'NO3' NO3 ))) ;
But I want to get the following table:
drop table parameter_pivot; create table parameter_pivot ( site_id VARCHAR(30), ANC NUMBER, NO3 NUMBER, ANC_method VARCHAR(30), NO3_method VARCHAR(30) ); insert into parameter_pivot values ('site1', 10.1, 2.1, 'Gran 1952', 'EPA 1983'); insert into parameter_pivot values ('site2', 21.8, 7.2, 'Gran 1952', 'EPA 1983');
How do I get the specific methods to attach to the specific parameter as a new column? I feel like it might be some sort of group by statement, but not sure where to start.
Thanks!
Advertisement
Answer
I would just use conditional aggregation:
select site_id, max(case when parameter = 'ANC' then value end) anc, max(case when parameter = 'NO3' then value end) no3, max(case when parameter = 'ANC' then method end) anc_method, max(case when parameter = 'NO3' then method end) no3_method from parameter_pivot group by side_id
This pivots the data over a fixed list of columns. If you want a dynamic pivot, then you need dynamic SQL, which is a different beast.