2014-10-09 12 views
6

Ich bin wenig neu zu Google Big Query und ich versuche, ein geschwenktes Ergebnis aus öffentlichen Beispieldatensatz zu erhalten.Wie Pivot-Tabelle in große Abfrage

Eine einfache Abfrage an bestehende Tabelle ist

SELECT * 
FROM publicdata:samples.shakespeare 
LIMIT 10; 

Diese Abfrage gibt folgende Ergebnismenge.

enter image description here

Nun, was ich versuche zu tun ist, dass die Ergebnisse aus der Tabelle in einer solchen Art und Weise, wenn das Wort mutig ist, wählen Sie „BRAVE“ als Spalte_1 und wenn das Wort besucht wird, wählen Sie „ATTENDED "as column_2, und aggregieren die Wortzahl für diese 2.

Hier ist die Abfrage, die ich verwende.

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; 

Aber diese Abfrage liefert die Daten

enter image description here

Was ich gesucht habe ist

enter image description here

Ich kenne diesen Drehpunkt für diesen Datensatz ist nicht sinnvoll . Aber ich nehme das nur als Beispiel, um das Problem zu erklären. Es wird toll sein, wenn du mir ein paar Anweisungen geben kannst.

EDITED: Ich habe auch auf How to simulate a pivot table with BigQuery? verwiesen und es scheint, dass es auch das gleiche Problem hat, das ich hier erwähnte.

Antwort

6

Ich bin nicht sicher, was Sie versuchen zu tun, aber:

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: Gleiche Ergebnisse, einfachere Abfrage:

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)] spalte_2, SUM (c) ' in standard-sql –

1

Versuchen Sie, diese

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

Dies würde das Ergebnis als 152 unter der Spalte "mutig" festlegen. Bitte beachten Sie, dass ich nach der Ergebnismenge gesucht habe, die "BRAVE" unter "column_1" und "ATTENDED" unter column_2 hat und dann die aggregare word_count die 194 ist. – user1401472

1

Auch von How to simulate a pivot table with BigQuery? inspiriert, die folgenden Anfrage subselect Verwendung ergibt Ihr genaues gewünschtes Ergebnis:

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 
) 

Der Trick ist, dass MAX(NULL, 'ATTENDED', NULL, ...)'ATTENDED' entspricht.

Verwandte Themen