Как назначить методы для определенного параметра c, используя PIVOT в SQL? - PullRequest
1 голос
/ 03 марта 2020

Мы работаем над созданием наших данных в виде реляционной базы данных / набора и набора данных столбцов строк (чтобы пользователи данных могли использовать тот формат, который им больше подходит). Вот упрощенная таблица наших данных:

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');

Я знаю, как повернуть значения, но это не помещает метод в конкретный c параметр_column (метод ANC_method или NO3):

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

Но я хочу получить следующую таблицу:

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');

Как мне получить методы специфицированного c для подключения к параметру c в качестве нового столбца? Я чувствую, что это может быть какая-то группировка за заявлением, но я не уверен, с чего начать.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Я бы просто использовал условную агрегацию:

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

Это сводит данные к фиксированному списку столбцов. Если вы хотите динамический c пивот, то вам нужен динамический c SQL, который является другим зверем.

1 голос
/ 04 марта 2020

Это должно быть сделано при полном внешнем объединении.

Я не думаю, что это возможно с опорой, если будет несколько методов для одного и того же параметра.

drop table parameter_pivot_test;
create table parameter_pivot_test
AS
(select coalesce(anc_site, no3_site) as site_id, anc, no3, anc_method, mo3_method from
(select site_id as anc_site, value as anc, method as anc_method from parameter_test where parameter = 'ANC') anc
FULL OUTER JOIN
(select site_id as no3_site, value as no3, method as no3_method from parameter_test where parameter = 'NO3') no3
ON anc.anc_site = no3.no3_site
)
;
0 голосов
/ 04 марта 2020

Используйте PIVOT и агрегируйте в столбцах value и method:

CREATE TABLE parameter_pivot_test AS
SELECT site_id,
       anc_value AS anc,
       no3_value AS noc,
       anc_method,
       no3_method
FROM   parameter_test
PIVOT (
  SUM( value ) AS value,
  MAX( method ) AS method
  FOR parameter IN (
   'ANC' AS ANC,
   'NO3' AS NO3
  )
);

Что для ваших тестовых данных:

create table parameter_test
 (
  site_id       VARCHAR(30),
  parameter     VARCHAR(30),
  value         NUMBER,
  method        VARCHAR(30)
);

insert into parameter_test ( site_id, parameter, value, method )
SELECT 'site1', 'ANC', 10.1,'Gran 1952' FROM DUAL UNION ALL
SELECT 'site2', 'ANC', 21.8, 'Gran 1952' FROM DUAL UNION ALL
SELECT 'site1', 'NO3', 2.1, 'EPA 1983' FROM DUAL UNION ALL
SELECT 'site2', 'NO3', 7.2, 'EPA 1983' FROM DUAL;

Дает вывод:

SELECT * FROM parameter_pivot_test;
SITE_ID |  ANC | NOC | ANC_METHOD | NO3_METHOD
:------ | ---: | --: | :--------- | :---------
site2   | 21.8 | 7.2 | Gran 1952  | EPA 1983  
site1   | 10.1 | 2.1 | Gran 1952  | EPA 1983  

дБ <> скрипка здесь

...