2012-05-16 22 views
5

Mam widoku, który wygląda jak tenkolumna transpozycji nagłówki wierszy w PostgreSQL

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

muszę przenieść nagłówek kolumny na wiersze i tak muszę to wyglądać

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

I można to zrobić, wybierając poszczególne nazwy kolumn jako pierwszą kolumnę i dane jako drugą kolumnę, a następnie dokonując ujednolicenia dla wszystkich kolumn.

Czy jest lepszy sposób to zrobić? Używam PosgreSQL 8.1, więc nie mam operatorów obrotowych do pracy.

Dziękujemy za odpowiedź z góry.

+0

tak podnosimy do najnowszych version..probably przez koniec lata .... Dzięki – cableload

+0

Kolumny jak i pytania, które (jak zwykle), które wskazują, wadliwej konstrukcji. Wspominasz o WIDOKU, więc może nie być tak w przypadku twoich stołów. Ale zastanów się nad przeprojektowaniem, jeśli ten widok odzwierciedla faktyczną strukturę tabeli –

Odpowiedz

22

macierz nie tylko na odwrót, co trzeba, ale to powinno pomóc:

Najpierw należy utworzyć funkcję unnest() który jest zawarty w 8.4, patrz here instrukcje.

Następnie można to zrobić (na podstawie this post):

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

mogę sprawdzić, czy to działa w 8.4, ale ponieważ nie mam 8.1, nie mogę obiecać, to będzie działać tak podobnie.

+2

To jest genialne..obrabiane dobrze w 8.1 .. moje zapytanie zbiorowe zajęło 10 sekund, a to niepokojące zapytanie zajęło 3 sekundy. Dzięki temu wiele PinnyM. – cableload

5

osiągnąłem swój cel za pomocą hstore „s funkcjonalności:

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

możesz mieć wiele wierszy na liście«do-eksplodowała»widoku lub tabeli (określane tu jako t), konieczne może być wstawić źródło dodatkowego identyfikatora w tabeli pośredniego q, np

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

odniesienia: hstore documentation

+0

+1, Zaletą jest tutaj uniknięcie konieczności nazwania kolumn w zapytaniu. Najwyraźniej [to nie działa tak dobrze, jak nie.] (Http://www.postgresonline.com/journal/archives/283-Unpivoting-data-in-PostgreSQL.html), ale nie w znaczącym stopniu. – PinnyM

+0

To wspaniałe rozwiązanie, dziękuję! Jedyny problem polega na tym, że kolejność kolumn zostaje pomieszana. Czy masz pojęcie, jak to obejść? – David

3

Szukałem czegoś podobnego, aby łatwiej przetwarzać informacje o tabelach ze skryptu bash. Okazuje się, że bardzo łatwo powiedzieć psql wyświetlanie kolumn tabeli jako wiersze:

psql mydbname -x -A -F= -c "select * from blah where id=123" 
  • -x co obraca wyjście.
  • The -A usuwa dodatkowe odstępy.
  • Model -F= zastępuje | z między nazwą kolumny a wartością.

To oczywiście nie będzie działać w SQL, tylko modyfikuje, jak psql dzieje się formatowanie danych wyjściowych.

0

Miałem podobną sytuację. Zapakowałem moje zapytanie w instrukcję with, a następnie zrobiłem kilka z UNION ALL s dla każdego wiersza. W mojej sytuacji, jeśli miałbym wiele rekordów, ncm_id byłby inny, więc dodałem to do mojej listy kolumn w moim zestawie wyników. Może nie jest to najlepszy sposób, aby to zrobić, ale zadziałało w moim przypadku użycia.

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; 
Powiązane problemy