PIVOT Таблица из мягко настроенных полей с ID Group - PullRequest
0 голосов
/ 09 января 2020

У меня есть некоторые динамические c поля формы, которые хранятся в базе данных как config со значениями, сохраненными для них в отдельной таблице, и я хочу создать представление, которое предоставляет таблицу PIVOT, превращающую значение FieldName в столбцы, которые затем сгруппированы по идентификатору.

SO следующая таблица:

ID  |  FieldName      |  FieldValue
1      An Integer        10
1      A String          Hello
1      A boolean         True
2      An Integer        20
2      A String          Goodbye
2      A Date            01/01/2010 

Будет выводиться как:

ID    |  [An Integer]    |  [A String]   |  [A boolean]   |  [A Date]
1        10                 Hello           True             Null
2        20                 Goodbye         NULL             01/01/2010

Может быть больше имен столбцов, чем это, и я в порядке с сторона Dynami c, но при условии, что таблица выше является фиксированной, как мне достичь PIVOT?

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Предполагая, что вы имеете дело с фиксированным списком имен полей, вы можете просто использовать условное агрегирование. Это решение для нескольких СУБД, которое не зависит от c реализаций PIVOT, определяемых поставщиком, и обычно работает так же или лучше:

select 
    ID,
    max(case when FieldName = 'An Integer' then FieldValue end) an_integer,
    max(case when FieldName = 'A String' then FieldValue end) a_string,
    max(case when FieldName = 'A Boolean' then FieldValue end) a_boolean,
    max(case when FieldName = 'A Date' then FieldValue end) a_date
from mytable
group by ID
0 голосов
/ 09 января 2020
SELECT * 
FROM your_table
PIVOT (
  MAX(FieldValue)
  FOR FieldName in (
    'An Integer', 'A String', 'A boolean', 'A Date'
  )
)

В вашем примере вы не указываете, как должен агрегироваться результат. Так что я просто использовал макс. Группировка выполняется с помощью центра, поэтому нет необходимости в дополнительной группе или чем-то в этом роде

...