2014-10-09 11 views
6

Sono poco nuovo a Google Big Query e sto cercando di ottenere un risultato pivot dal set di dati pubblici.Come tabella pivot in Big Query

una semplice query di tabella esistente è

SELECT * 
FROM publicdata:samples.shakespeare 
LIMIT 10; 

Questo restituisce la query set di risultati seguente.

enter image description here

Ora quello che sto cercando di fare è, ottenere i risultati del tavolo in modo tale che se la parola è coraggioso, selezionare "BRAVE", come column_1 e se la parola è assistito, selezionare "hanno partecipato "come column_2 e aggregare il conteggio delle parole per questi 2.

Ecco la query che sto utilizzando.

SELECT 
(CASE WHEN word = 'brave' THEN 'BRAVE' ELSE '' END) AS column_1, 
(CASE WHEN word = 'attended' THEN 'ATTENDED' ELSE '' END) AS column_2, 
SUM (word_count) 
FROM publicdata:samples.shakespeare 
WHERE (word = 'brave' OR word = 'attended') 
GROUP BY column_1, column_2 
LIMIT 10; 

Ma, questa query restituisce i dati

enter image description here

Quello che stavo cercando

enter image description here

So che questo perno per questo insieme di dati non ha senso . Ma sto prendendo questo come esempio per spiegare il problema. Sarà fantastico se riesci a mettere in qualche direzione per me.

MODIFICATO: Ho anche fatto riferimento a How to simulate a pivot table with BigQuery? e sembra che abbia lo stesso problema che ho menzionato qui.

risposta

6

io non sono sicuro di quello che si sta cercando di fare, ma:

SELECT NTH(1, words) WITHIN RECORD column_1, NTH(2, words) WITHIN RECORD column_2, f0_ 
FROM (
    SELECT NEST(word) words, SUM(c) 
    FROM (
    SELECT word, SUM(word_count) c 
    FROM publicdata:samples.shakespeare 
    WHERE word in ('brave', 'attended') 
    GROUP BY 1 
) 
) 

enter image description here

UPDATE: risultati stessi, più semplice query:

SELECT NTH(1, word) column_1, NTH(2, word) column_2, SUM(c) 
FROM (
    SELECT word, SUM(word_count) c 
    FROM publicdata:samples.shakespeare 
    WHERE word in ('brave', 'attended') 
    GROUP BY 1 
) 
+0

'SELECT word [SAFE_ORDINAL (1)] column_1, word [SAFE_ORDINAL (2)] column_2, SUM (c) ' in standard-sql –

1

Prova questo

SELECT sum(CASE WHEN word = 'brave' THEN word_count ELSE 0 END) AS brave , sum(CASE WHEN word = 'attended' THEN word_count ELSE 0 END) AS attended, SUM (word_count) as total_word_count FROM publicdata:samples.shakespeare WHERE (word = 'brave' OR word = 'attended') 
+0

Ciò darebbe il risultato impostato a 152 nella colonna "coraggioso". Si prega di notare che stavo cercando il set di risultati che ha "BRAVE" sotto "column_1" e "ATTENDED" sotto column_2 e quindi l'aggregare word_count che è 194. – user1401472

1

anche ispirato dalla How to simulate a pivot table with BigQuery?, la seguente richiesta utilizzando subselect produce il risultato esatto desiderato:

SELECT 
    MAX(column_1), 
    MAX(column_2), 
    SUM(wc), 
FROM (
    SELECT 
    (CASE WHEN word = 'brave' THEN 'BRAVE' ELSE '' END) AS column_1, 
    (CASE WHEN word = 'attended' THEN 'ATTENDED' ELSE '' END) AS column_2, 
    SUM (word_count) AS wc 
    FROM publicdata:samples.shakespeare 
    WHERE (word = 'brave' OR word = 'attended') 
    GROUP BY column_1, column_2 
    LIMIT 10 
) 

Il trucco è che MAX(NULL, 'ATTENDED', NULL, ...) uguale 'ATTENDED'.