2012-05-16 11 views
5

Ho una visione che assomiglia a questocolonna di trasposizione intestazioni di righe in PostgreSQL

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

ho bisogno di trasporre l'intestazione di colonna in righe e quindi ho bisogno di farlo sembrare come

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

I può farlo selezionando singoli nomi di colonne come prima colonna e dati come seconda colonna e poi fare un'unione uguale per tutte le colonne.

C'è un modo migliore per farlo? Sto usando PosgreSQL 8.1 e quindi non ho operatori pivot con cui lavorare.

Grazie per la risposta in anticipo.

+0

sì stiamo aggiornando all'ultima version..probably entro la fine dell'estate .... Grazie – cableload

+0

Le colonne del genere (e domande del genere) di solito indicano un disegno difettoso. Hai menzionato una VISTA coinvolta, quindi potrebbe non essere il tuo caso con i tuoi tavoli. Ma considera una riprogettazione se quella vista riflette la struttura attuale della tabella –

risposta

22

campi incrociati fa solo il contrario di quello che ti serve, ma questo dovrebbe aiutare:

Innanzitutto creare la funzione unnest() che è incluso in 8.4, vedere here per le istruzioni.

Poi si può fare questo (sulla base this post):

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

posso verificare che questo funziona in 8.4, ma perché non ho 8.1, non posso promettere che funzionerà la stesso.

+2

Questo è brillante .. funzionava bene in 8.1 .. la mia query di unione impiegava 10 secondi e questa query non necessaria richiedeva solo 3 secondi ... Grazie mille PinnyM. – cableload

5

ho raggiunto il vostro obiettivo utilizzando hstore 's funzionalità:

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

Che tu possa avere più righe nel vostro 'to-be-esploso' vista o una tabella (di cui qui come t), potrebbe essere necessario inserire un identificatore additionnal nella tabella intermedia q, ad esempio:

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

Riferimento: hstore documentation

+0

+1, il vantaggio qui è evitare la necessità di assegnare un nome alle colonne nella query. Apparentemente [non si comporta abbastanza bene come ingiustificato] (http://www.postgresonline.com/journal/archives/283-Unpivoting-data-in-PostgreSQL.html), ma non in misura significativa. – PinnyM

+0

Questa è una soluzione geniale, grazie! L'unico problema è che l'ordine delle colonne viene incasinato. Hai qualche idea su come aggirare questo? – David

3

Stavo cercando di fare qualcosa di simile a questo per elaborare più facilmente le informazioni della tabella da uno script bash. Risulta essere molto facile dire psql per visualizzare le colonne della tabella come righe:

psql mydbname -x -A -F= -c "select * from blah where id=123" 
  • Il -x è quello che fa ruotare l'uscita.
  • Il -A rimuove la spaziatura aggiuntiva.
  • Il -F= sostituisce | con = tra il nome della colonna e il valore.

Questo ovviamente non funziona in SQL, modifica solo il modo in cui psql si verifica per la formattazione dell'output.

0

Ho avuto una situazione simile. Ho avvolto la mia domanda in una dichiarazione with e poi ho fatto un mucchio di UNION ALL s per ogni riga. Nella mia situazione, se avessi più record, ncm_id sarebbe diverso, quindi sono andato avanti e l'ho aggiunto alla mia lista di colonne nel mio set di risultati. Questo potrebbe non essere il modo migliore per farlo, ma ha funzionato per il mio caso d'uso.

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; 
Problemi correlati