2017-11-22 3 views
0

sie ersetzen sagt, dass ich eine Abfrage habeAbfrage Nullwerte Daten BigQuery

#standardSQL 
SELECT a.person, score, dte 
FROM 
(
    SELECT 'Aaron' person UNION ALL 
    SELECT 'Baron' person UNION ALL 
    SELECT 'Cindy' person 
)a 
LEFT JOIN 
(
    SELECT 'Aaron' person, 10 score, 20 dte UNION ALL 
    SELECT 'Baron' person, 20 score, 20 dte UNION ALL 
    SELECT 'Aaron' person, 10 score, 21 dte UNION ALL 
    SELECT 'Cindy' person, 10 score, 21 dte UNION ALL 
    SELECT 'Baron' person, 20 score, 21 dte 
)b 
on a.person = b.person 
order by dte 

Das Ergebnis ist

Row person score dte 
1 Aaron 10  20 
2 Baron 20  20 
3 Aaron 10  21 
4 Baron 20  21 
5 Cindy 10  21 

Jetzt kann ich ein Datum auch von „Cindy“ mit 0 Partitur und dte habe = 20?

so die Erwartung ist:

Row person score dte 
1 Aaron 10  20 
2 Baron 20  20 
3 Cindy 0  20 
4 Aaron 10  21 
5 Baron 20  21 
6 Cindy 10  21 

Es ist notwendig, nicht links zu verwenden, beizutreten. Im Grunde habe ich nur 1 Tabelle, aber will nur Daten von 0 für jeden Tee und Person haben.

Antwort

2

ist unten für BigQuery Standard-SQL

#standardSQL 
WITH persons AS (
    SELECT 'Aaron' person UNION ALL 
    SELECT 'Baron' person UNION ALL 
    SELECT 'Cindy' person UNION ALL 
    SELECT 'Mike' person 
), scores AS (
    SELECT 'Aaron' person, 10 score, 20 dte UNION ALL 
    SELECT 'Baron' person, 20 score, 20 dte UNION ALL 
    SELECT 'Aaron' person, 10 score, 21 dte UNION ALL 
    SELECT 'Cindy' person, 10 score, 21 dte UNION ALL 
    SELECT 'Baron' person, 20 score, 21 dte 
), dtes AS (
    SELECT DISTINCT dte 
    FROM scores 
) 
SELECT a.person, IFNULL(score, 0) score, d.dte 
FROM persons a CROSS JOIN dtes d 
LEFT JOIN scores b 
ON a.person = b.person AND d.dte = b.dte 
ORDER BY dte, person 

mit Ergebnis wie unten

person score dte  
Aaron 10  20  
Baron 20  20  
Cindy 0  20  
Mike  0  20  
Aaron 10  21  
Baron 20  21  
Cindy 10  21  
Mike  0  21