Как «объединить» эти 3 записи в один ряд?(связаны одним и тем же составным ключом) - PullRequest
0 голосов
/ 06 февраля 2019

Итак, у меня есть следующие примеры данных (3 таблицы)

У меня есть «основная» таблица драйверов с именем CASE

CASE_ID      CASE_NAME        CASE_DATE
   1         Test1            01-JAN-18
   2         Test2            02-JAN-18
   3         Test1 p2         03-JAN-18
   4         Test2 p2         03-JAN-18

У меня есть rel_table, которая называется CASE_VAL_REL

CASE_VAL_ID       CASE_ID       VAL_ID          CASE_VAL_TYPE
    1               1             1             Weight
    2               3             2             Height
    3               3             3             Age
    4               2             4             Weight
    5               4             5             Height
    6               4             6             Age

И, наконец, у меня есть таблица, которую необходимо присоединить к таблице REL, которая называется VAL

VAL_ID      VAL       TIMESTAMP      PERSON_NAME      GENDER
  1         150       06-FEB-19      Matt             Male
  2         62        06-FEB-19      Matt             Male
  3         25        06-FEB-19      Matt             Male
  4         100       06-FEB-19      Pauline          Female
  5         70        06-FEB-19      Pauline          Female
  6         22        06-FEB-19      Pauline          Female

Мне нужнонабор результатов / таблица, которая выглядит следующим образом (к ней нельзя присоединить case_id, так как они открыли два отдельных случая для получения необходимой информации. Вместо этого нам может потребоваться объединение по «составному ключу» некоторых видов. Ниже приведен мойжелаемый набор результатов:

 PERSON_NAME    GENDER     AGE      WEIGHT    HEIGHT
  Matt          Male       25       150       62
  Pauline       Female     22       100       70

Ниже моя попытка, но она не совсем работает, как я хочу (по крайней мере, для большего набора данных)

SELECT  MAX(CASE WHEN CASE_VAL_TYPE = 'Weight'
            THEN VAL
             END)   as             Weight
     , MAX(CASE WHEN CASE_VAL_TYPE = 'Height'
            THEN VAL
             END)   as             Height
     , MAX(CASE WHEN CASE_VAL_TYPE = 'Age'
            THEN VAL
             END)   as             Age
     , PERSON_NAME
     , GENDER
   FROM CASE C
   JOIN CASE_VAL_REL CVR on C.CASE_ID = CVR.CASE_ID
   JOIN VAL V on CVR.VAL_ID = V.VAL_ID
  GROUP BY PERSON_NAME, GENDER;

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 06 февраля 2019

Я просто взял VAL_ID в качестве порядкового номера и VAL, упорядоченный по весу, росту и возрасту, не уверен, что моя интерпретация верна для получения ожидаемого результата из финальной таблицы 'VAL' только во избежание присоединения к другим таблицам.

 create table VAL
    (VAL_ID NUMBER,
    VAL   NUMBER,
    TIMESTAMP DATE,
    PERSON_NAME varchar2(20),
    GENDER   varchar2(10));

    insert into VAL values(1,150,'06-FEB-19','Matt','Male');
    insert into VAL values(2,62,'06-FEB-19','Matt','Male');
    insert into VAL values(3,25,'06-FEB-19','Matt','Male');
    insert into VAL values(4,100,'06-FEB-19','Pauline','Female');
    insert into VAL values(5,70,'06-FEB-19','Pauline','Female');
    insert into VAL values(6,22,'06-FEB-19','Pauline','Female');


    select PERSON_NAME,GENDER,
          max(case when mod(VAL_ID,3)=1 then VAL end) "WEIGHT",
          max(case when mod(VAL_ID,3)=2 then VAL end) "HEIGHT",
          max(case when mod(VAL_ID,3)=0 then VAL end) "AGE"
    from VAL
    group by PERSON_NAME,GENDER;
0 голосов
/ 06 февраля 2019

Я переименовал таблицы t1, t2 и t3.Глядя на данные, я затем отбросил t1 из решения, так как вы, похоже, хотите, чтобы по одному человеку приходилось по одной строке, поэтому все целевые данные находятся в t2 и t3.Я выбрал имя, пол и SUM (случай, когда case_val_type = 'X', затем val else 0), где X - это каждый возможный тип FROM (С людьми как (выберите отдельное имя человека из t3) выберите people.person_name, t3.gender, t2.case_val_type, t3.val из людей присоединяется к t3 на t3.person_name = people.person_name присоединяется к t2 на t2.val_id = t3.val_id) iq group по iq.person_name, iq.gender, и в результате получается ваша двухстрочная цель.- Простите, что я не форматировал это, но я еще не нашел инструкции по форматированию.

0 голосов
/ 06 февраля 2019

Я предлагаю вам изменить регистр гривы в случаях, чтобы избежать конфликта со случаем, когда синтаксис и начальная форма VAL используют левое соединение для CASES

SELECT  MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Weight'
            THEN V.VAL
             END)   as             Weight
     , MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Height'
            THEN V.VAL
             END)   as             Height
     , MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Age'
            THEN V.VAL
             END)   as             Age
     , V.PERSON_NAME
     , V.GENDER
   FROM VAL V 
   INNER JOIN CASE_VAL_REL CVR on CVR.VAL_ID = V.VAL_ID 
   LEFT JOIN  CASES C on C.CASE_ID = CVR.CASE_ID
   GROUP BY PERSON_NAME, GENDER;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...