2016-04-29 28 views
0

Ich arbeite in BigQuery. Ich habe zwei Tabellen bekommt:Aggregierte Abfrage über zwei Tabellen in SQL?

TABLE: orgs 
code: STRING 
group: STRING 

TABLE: org_employees 
code: STRING 
employee_count: INTEGER 

Die code in jeder Tabelle ist effektiv ein Fremdschlüssel. Ich möchte alle einzigartigen group s, mit einer Zählung der Orgs in ihnen, und (das ist das heikle Bit) eine Zählung, wie viele dieser Orgs haben nur einen einzigen Mitarbeiter. Daten, die wie folgt aussieht:

group,orgs,single_handed_orgs 
00Q,23,12 
00K,15,7 

Ich weiß, wie das erste Bit zu tun, bekommen Sie die einzigartige group s und Anzahl der zugehörigen Orgs aus der orgs Tabelle:

SELECT 
    count(code), group 
FROM 
    [orgs] 
GROUP BY group 

Und, ich weiß, wie man erhalten die Anzahl der einhändig Orgs aus der Praxis Tabelle:

SELECT 
    code, 
    (employee_count==1) AS is_single_handed 
FROM 
    [org_employees] 

Aber ich bin nicht sicher, wie sie miteinander verkleben. Kann jemand helfen?

+0

In ORGS-Tabelle wer ist Primärschlüssel? –

+0

In org_employees haben Sie für jeden Code eine Anzahl von assoziierten Mitarbeitern? –

+0

Sie haben Writeen-Code ist ein Fremdschlüssel. Wie lautet der Name der Tabelle, in der der Code der Primärschlüssel ist? –

Antwort

2

für BigQuery: Legacy SQL

SELECT 
    [group], 
    COUNT(o.code) as orgs, 
    SUM(employee_count = 1) as single_handed_orgs 
FROM [orgs] AS o 
LEFT JOIN [org_employees] AS e 
ON e.code = o.code 
GROUP BY [group] 

LEFT JOIN, falls verwendet, wenn einige Codes in org_employees Tabellen fehlen

für BigQuery: Standard-SQL-

SELECT 
    grp, 
    COUNT(o.code) AS orgs , 
    SUM(CASE employee_count WHEN 1 THEN 1 ELSE 0 END) AS single_handed_orgs 
FROM orgs AS o 
LEFT JOIN org_employees AS e 
ON e.code = o.code 
GROUP BY grp 

Hinweis Verwendung von grp vs group - sieht aus wie SQL-Standard funktioniert wie Verwendung von Reserved Keywords auch wenn ich Backticks um

setzen Bestätigt:

Sie Schlüsselwort mit Backticks um

verwenden können
+0

Vielen Dank. – Richard

+0

@MikhailBerlyant - können Sie Repro für reservierte Schlüsselwörter geben. Das heißt, die folgende Abfrage, die "Gruppe" rückgängig macht, funktioniert gut: wähle "Gruppe" aus (Wähle 1 als "Gruppe") Gruppe durch "Gruppe" –

+0

irgendwie funktionierte es nicht für mich, als ich die Frage beantwortete. wird wieder überprüfen –

0

Sie können die beiden Tabellen verbinden, um die Gruppen mit nur einem Mitarbeiter zu erhalten. Dann wickeln Sie dies in eine Unterabfrage ein und Sie zählen die Gruppen, die Sie haben.

Ich verwende eine COUNT DISTINCT und GROUP BY, weil ich nicht weiß, wie Ihre Daten strukturiert sind. Gibt es nur eine einzige Zeile pro Gruppe oder mehrere?

SELECT 
    COUNT(DISTINCT group) 
FROM (
    SELECT 
     group 
    FROM 
     orgs AS o INNER JOIN org_employees AS e ON o.code = e.code 
    WHERE 
     employee_count = 1 
    GROUP BY 
     group 
    )