2012-01-15 13 views
5

Sono nuovo di SQL e stavo cercando di eseguire una tabella incrociata in Postgres. L'avrei fatto in Excel, ma ho un database di circa 3,5 milioni di righe, 20.000 valori diversi per il codice, 7 categorie in cat e valori variabili da 1 a 100. Un codice può avere solo alcune delle 7 categorie.Scheda incrociata PostgreSQL con tre colonne con valori sommati da una colonna

Excel non può gestire il numero di righe, quindi SQL è.

miei dati è in forma

code | cat  | value | 
-------------------------------- 
abc123 | 1   | 4 | 
abc234 | 2   | 6 | 
abc345 | 1   | 1 | 
abc123 | 3   | 2 | 
abc123 | 6   | 12 | 

con il codice e il gatto come testo, valore integer memorizzata in una tabella Postgres.

Vorrei eseguire una tabella incrociata su codice e cat, con somma di valore. Mi piacerebbe che mostrasse zero invece di 'null' nel ritorno, ma se 'null' sarebbe una query più semplice, allora sarebbe bene.

Così l'uscita che vorrei è

code | 'cat=0' | 'cat=1' | 'cat=2' | 'cat=3' | 'cat=4' | 'cat=5' | 'cat=6'| 
abc123 | 25  | 0  | 3  | 500 | 250  | 42  | 0  | 
abc234 |  0  | 100 | 0  | 10 | 5  | 0  | 25 | 
abc345 | 1000 | 0  | 0  | 0 | 0  | 0  | 0 | 

Ho cercato il file di aiuto Postgres e altri forum; la cosa più vicina era la domanda SO PostgreSQL Crosstab Query ma non riuscivo a capire come sommare i valori dalla terza colonna.

Qualsiasi assistenza sarebbe molto apprezzata.

+0

Avete qualcosa finora? ;) – plaes

+0

solo frustrazione .. provato molti esempi da molti siti. anche facendo una semplice tabella incrociata, sto ricevendo errore 42601 .. tipo disadattamento – Siraj

+0

Sì, ma che cosa hai provato finora? – plaes

risposta

3

Prova:

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code text, 
     cat_0 int, 
     cat_1 int, 
     cat_2 int, 
     cat_3 int, 
     cat_4 int, 
     cat_5 int, 
     cat_6 int) 
+2

grazie .. l'ho provato, ma ottengo questo errore .... ERRORE: tipo di ritorno non valido DETTAGLIO: il tipo di dati rowid SQL non corrisponde al tipo di dati rowid di ritorno. ********** ********** errore ERRORE: non valida tipo di ritorno dello stato SQL: 42601 Particolare: SQL rowid tipo di dati non corrisponde a ritornare tipo di dato identificativo. – Siraj

+0

provato con count (valore), usando il testo invece di int dopo 'cat_0' ecc finisce sempre con lo stesso errore: sql state: 42601 – Siraj

5

Ho ottenuto questo lavoro aggiornando il mio codice al seguente:

select * from crosstab(
'select code, cat, sum(value) as value 
from my_table 
group by code, cat 
order by 1,2' 
) as ct(code varchar(255), 
    cat_0 bigint, 
    cat_1 bigint, 
    cat_2 bigint, 
    cat_3 bigint, 
    cat_4 bigint, 
    cat_5 bigint, 
    cat_6 bigint) 

sono stato in grado di determinare il tipo di dati a destra eseguendo l'istruzione select all'interno del campo incrociato e corrispondenza tra i miei tipi di dati come ct e quelli restituiti dalla query all'interno della tabella a campi incrociati.

+0

Ho notato che i nomi delle colonne cat_XX possono essere casuali, postgres non li combina .. . :( – Chris

+0

@Chris se hai bisogno di un ordine puoi provare questo- SELEZIONA * FROM crosstab ('tua query', $$ VALUES ('cat_xx' :: testo), ('cat_xx2' :: testo) $$) –

Problemi correlati