У меня есть таблица значений пары ключей KVP, Нужно sql, чтобы сделать его реляционную структуру ...! - PullRequest
1 голос
/ 20 марта 2010

У меня есть таблица KVP, структура: ID, ключ, значение.

Вот несколько примеров значений ...

ID, KEY,       VALUE
---------------------
 1, STATUS,    TRUE
 1, AGE GROUP, 10
 1, TRAVEL,    Y
 2, STATUS,    FALSE
 2, AGE GROUP, 20
 2, TRAVEL,    N

Я хочу, чтобы эти значения были преобразованы, как показано ниже ...

ID, STATUS, AGE GROUP, TRAVEL
------------------------------
 1, TRUE,   10,        Y
 2, FALSE,  20,        N

Я читал о crosstab / pivot, но я не могу сделать запрос, который может дать мне вывод выше. Есть ли способ в SQL сделать мой вывод похожим на приведенный выше пример?

Ответы [ 3 ]

2 голосов
/ 20 марта 2010

Если предположить, что Oracle основан на теге, тогда

SELECT DISTINCT id
  , MAX(CASE key WHEN 'STATUS' THEN value ELSE null END) OVER (PARTITION BY id) status
  , MAX(CASE key WHEN 'AGE GROUP' THEN value ELSE null END) OVER (PARTITION BY id) age_grp
  , MAX(CASE key WHEN 'TRAVEL' THEN value ELSE null END) OVER (PARTITION BY id) travel
FROM kvp
ORDER BY id;
0 голосов
/ 22 марта 2010
select
    min(decode(KEY, 'ID',        VALUE, null)) ID,
    min(decode(KEY, 'STATUS',    VALUE, null)) STATUS,
    min(decode(KEY, 'AGE GROUP', VALUE, null)) AGE_GROUP,
    min(decode(KEY, 'TRAVEL',    VALUE, null)) TRAVEL
from
    KVP
0 голосов
/ 20 марта 2010

Возможно, есть оптимизации, но это работает (протестировано в SQLite и MySQL)

select stat.id as id, status, age_group, travel from 
(select id, Value as status from kvp
where Key = 'STATUS') as stat JOIN
(select id, Value as age_group from kvp
where Key = 'AGE GROUP') as age on stat.id = age.id JOIN
(select id, Value as travel from kvp
where Key = 'TRAVEL') as trav on stat.id = trav.id;

Отредактировано для исправления возможной неоднозначности.

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