Как использовать горизонтальные данные, сохраненные в таблице как столбцы в postgres - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть такая таблица:

Таблица VR

ID  Key         Value   Date
123 First_Name  Vlad    01-01-2011
234 First_Name  Jim     07-01-2011
456 First_Name  Olimpia 10-02-2012
123 Last_Name   Kofman  12-02-2014
234 Last_Name   Cramer  14-02-2014
456 Last_Name   Dukakis 04-03-2015
123 Dept    IT          08-03-2016
234 Dept    Marketing
456 Dept    Accounting
123 Sex M
234 Sex M
456 Sex F

Теперь я хочу написать запрос, чтобы получить значение, где First_Name = 'Vlad' AND Last_Name = 'Cramer ». Еще один сценарий ios - это то, что я хочу получить все записи между датами '01-01-2011 'и '14 -02-2016'.

Написанный мною запрос:

SELECT VR.key,
      Min(( CASE
              WHEN ( VR.key = 'FIRST_NAME' ) THEN
             VR.value
              ELSE 'n/a'
            END )) AS first_name,
      Min(( CASE
              When ( VR.key = 'LAST_NAME' ) THEN
              VR.value
              ELSE 'n/a'
            END )) AS last_name
FROM   VR
WHERE   ( ( VR.first_name = 'Vlad' )
          AND ( VR.last_name = 'Cramer' ) )
GROUP  BY VR.key
ORDER  BY VR.first_name,
VR.last_name

Исключение, которое я получаю, - Amazon] (500310) Недопустимая операция: столбец VR.first_name не существует;

Может кто-нибудь помочь мне узнать, как мне достичь желаемого результата.

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы должны построить из своей таблицы VR обычную таблицу и использовать ее в качестве отправной точки для выполнения запроса или построения представления из этого внутреннего SELECT

SELECT 
    *
FROM
    (SELECT 
        VR.id,
            MAX(IF(VR.key = 'First_Name', VR.Value, NULL)) 'First_Name',
            MAX(IF(VR.key = 'Last_Name', VR.Value, NULL)) 'Last_Name',
            MAX(IF(VR.key = 'Dept', VR.Value, NULL)) 'Dept',
            MAX(IF(VR.key = 'Sex M', 'male', IF(VR.key = 'Sex F', 'female', NULL))) 'Gender'
    FROM
        VR
    GROUP BY VR.id) comp
WHERE
    First_Name = 'Vlad'
        AND Last_Name = 'Kofman';
 id | First_Name | Last_Name | Dept | Gender
--: | :--------- | :-------- | :--- | :-----
123 | Vlad       | Kofman    | IT   | male  

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

1 голос
/ 10 апреля 2020

В вашей таблице нет столбцов с именами first_name или last_name - это значения в столбце key.

Я думаю, что вы действительно ищете условную агрегацию:

select id
from vr
where key in ('First_Name', 'Last_Name')
group by id
having 
    max(case when key = 'First_Name' and value = 'Vlad' then 1 end) = 1
    and max(case when key = 'Last_Name' and value = 'Cramer' then 1 end) = 1

Это дает вам id s, чье имя равно Владу, а фамилия - Крамеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...