Вопрос по postgresql, sql – транспонировать заголовки столбцов в строки в postgresql

7

У меня есть вид, который выглядит так

          value1count     value2count value3count
          ----------------------------------------
             25              35          55

Мне нужно переместить заголовок столбца в строки, и поэтому мне нужно, чтобы он выглядел как

          Values              Count
         -----------------------------
           value1count         25
           value2count         35
           value3count         55

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

Есть лучший способ сделать это? Я использую PosgreSQL 8.1, и поэтому у меня нет опорных операторов для работы.

Спасибо за ваш ответ заранее.

да, мы обновляемся до последней версии ... вероятно, к концу лета .... Спасибо cableload
Подобные столбцы (и подобные вопросы) обычно указывают на некорректный дизайн. Вы упомянули вовлеченный ПРОСМОТР, так что это может быть не так с вашими столами. Но рассмотрите возможность изменения дизайна, если это представление отражает фактическую структуру таблиц a_horse_with_no_name

Ваш Ответ

4   ответа
3

чтобы легче обрабатывать информацию таблицы из скрипта bash. Оказывается, очень легко сказать psql отображать столбцы таблицы в виде строк:

psql mydbname -x -A -F= -c "select * from blah where id=123"
The-x это то, что влияет на вывод.The-A удаляет лишние пробелы.The-F= заменяет| с= между именем столбца и значением.

Это, конечно, не работает в SQL, это только изменяет, какpsql происходит с форматированием вывода.

28

Сначала создайunnest() функция, включенная в 8.4, см.Во для инструкций.

Затем вы можете сделать это (на основеэт после)

SELECT
   unnest(array['value1Count', 'value2Count', 'value3Count']) AS "Values",
   unnest(array[value1Count, value2Count, value3Count]) AS "Count"
FROM view_name
ORDER BY "Values"

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

Это блестяще ... отлично сработало в 8.1 ... мой запрос на объединение занял 10 секунд, а этот нестандартный запрос занял 3 секунды ... Большое спасибо PinnyM. cableload
Только что попробовал в postgresql 11, и это сработало из коробки. Dino Dini
5

Я достиг твоей цели с помощьюhstoreункциональность @:

SELECT (x).key, (x).value
FROM
  ( SELECT EACH(hstore(t)) as x
    FROM   t
  ) q;

Может быть, у вас есть несколько строк в вашем представлении или в таблице, которая будет взорвана (обозначается здесь какt), вам может понадобиться добавить дополнительный идентификатор в промежуточную таблицуq, например

SELECT id, (x).key, (x).value
FROM
  ( SELECT id, EACH(hstore(t)) as x
    FROM   t
  ) q;

Ссылка:hstore документаци

Это отличное решение, спасибо! Единственная проблема заключается в том, что порядок столбцов нарушен. У вас есть идеи, как это обойти? David
+ 1, преимуществом здесь является то, что вам не нужно называть столбцы в запросе. По всей видимости это не так хорошо, как гнезда, но не в значительной степени. PinnyM
0

а затем сделал кучуUNION ALL для каждой строки. В моей ситуации, если бы у меня было несколько записей, ncm_id был бы другим, поэтому я пошел дальше и добавил это в свой список столбцов в своем наборе результатов. Возможно, это не лучший способ сделать это, но это сработало для моего варианта использования.

 WITH query_a AS (
     SELECT
       fin_item.item_number || ' - ' || fin_item.item_descrip1 fin_item,
       fin_ls.ls_number,
       ls_sort.sortby_employeeid,
       ls_sort.ncm_id,
       ls_sort.created_at,
       ls_sort.updated_at,
       ls_sort.sort_qty,
       ls_sort.initial_scan_time,
       ls_sort.ncm_scan_time,
       ls_sort.badge_scan_time,
       ls_sort.computer_name,
       ls_sort.number_of_ops,
       ls_sort.ncm_item_scan_time,
       sort_by.name sort_by,
       tblncm.instructions,
       tblncm.ncm_comments
     FROM public.item AS fin_item
       INNER JOIN public.ls AS fin_ls ON fin_item.item_id = fin_ls.ls_item_id
       INNER JOIN stone.ls_sort ON fin_ls.ls_id = ls_sort.ls_id
       INNER JOIN stone.vw_mssql_employees AS sort_by ON ls_sort.sortby_employeeid = sort_by.employeeid
       INNER JOIN stone.tblncm ON ls_sort.ncm_id = tblncm.ncm_id
       LEFT JOIN stone.equips AS mach_equips ON ls_sort.mach_equip_id = mach_equips.id
       LEFT JOIN stone.equips AS mold_equips ON ls_sort.mold_equip_id = mold_equips.id
     WHERE 1 = 1
           AND fin_ls.ls_number ILIKE 'S143027526190' || '%'
 )
   SELECT *
   FROM (
     (SELECT 'fin_item' my_column, fin_item::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ls_number' my_column, ls_number::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sortby_employeeid' my_column, sortby_employeeid::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_id' my_column, ncm_id::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'created_at' my_column, created_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'updated_at' my_column, updated_at::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sort_qty' my_column, sort_qty::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'initial_scan_time' my_column, initial_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_scan_time' my_column, ncm_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'badge_scan_time' my_column, badge_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'computer_name' my_column, computer_name::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'number_of_ops' my_column, number_of_ops::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_item_scan_time' my_column, ncm_item_scan_time::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'sort_by' my_column, sort_by::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'instructions' my_column, instructions::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
      UNION ALL
     (SELECT 'ncm_comments' my_column, ncm_comments::TEXT my_value, ncm_id::TEXT my_ncm FROM query_a)
   ) as query_guy
 ORDER BY my_ncm;

Похожие вопросы