2016-03-28 13 views
0

In MYSQL versuche ich die Aggregatfunktionen zu verstehen und versuche einige Beispiele im Northwind-Schema.Grundlegendes zu JOINS-, Unterabfrage- und Aggregatfunktionen

Die Tabelle Mitarbeiter hat die folgende Beschreibung.

+-----------------+-------------+------+-----+---------+----------------+ 
    | Field   | Type  | Null | Key | Default | Extra   | 
    +-----------------+-------------+------+-----+---------+----------------+ 
    | id    | int(11)  | NO | PRI | NULL | auto_increment | 
    | company   | varchar(50) | YES | MUL | NULL |    | 
    | last_name  | varchar(50) | YES | MUL | NULL |    | 
    | first_name  | varchar(50) | YES | MUL | NULL |    | 
    | email_address | varchar(50) | YES |  | NULL |    | 
    | job_title  | varchar(50) | YES |  | NULL |    | 
    | business_phone | varchar(25) | YES |  | NULL |    | 
    | home_phone  | varchar(25) | YES |  | NULL |    | 
    | mobile_phone | varchar(25) | YES |  | NULL |    | 
    | fax_number  | varchar(25) | YES |  | NULL |    | 
    | address   | longtext | YES |  | NULL |    | 
    | city   | varchar(50) | YES | MUL | NULL |    | 
    | state_province | varchar(50) | YES | MUL | NULL |    | 
    | zip_postal_code | varchar(15) | YES | MUL | NULL |    | 
    | country_region | varchar(50) | YES |  | NULL |    | 
    | web_page  | longtext | YES |  | NULL |    | 
    | notes   | longtext | YES |  | NULL |    | 
    | attachments  | longblob | YES |  | NULL |    | 
    +-----------------+-------------+------+-----+---------+----------------+ 

Auch die Daten in der Tabelle sind

mysql> select city , first_name,last_name from employees; 
    +----------+------------+----------------+ 
    | city  | first_name | last_name  | 
    +----------+------------+----------------+ 
    | Seattle | Nancy  | Freehafer  | 
    | Bellevue | Andrew  | Cencini  | 
    | Redmond | Jan  | Kotas   | 
    | Kirkland | Mariya  | Sergienko  | 
    | Seattle | Steven  | Thorpe   | 
    | Redmond | Michael | Neipper  | 
    | Seattle | Robert  | Zare   | 
    | Redmond | Laura  | Giussani  | 
    | Seattle | Anne  | Hellung-Larsen | 
    +----------+------------+----------------+ 

ich zu verstehen versuchen, wie kann ich die durchschnittliche Anzahl von Menschen aus verschiedenen Städten.

bis jetzt, ich habe

mysql> select city,count(city) from employees group by city; 
    +----------+-------------+ 
    | city  | count(city) | 
    +----------+-------------+ 
    | Bellevue |   1 | 
    | Kirkland |   1 | 
    | Redmond |   3 | 
    | Seattle |   4 | 
    +----------+-------------+ 

Auch habe ich

SELECT SUM(inner_count_city) from 
    (
      SELECT city AS inner_city, 
      COUNT(*) AS inner_count_city 
      FROM employees 
      GROUP BY inner_city 
    ) temp_table; 
    +-----------------------+ 
    | SUM(inner_count_city) | 
    +-----------------------+ 
    |      9 | 
    +-----------------------+ 

Ich kämpfe diese aufgrund der folgenden Gründe gehen nach vorne zu tun.

  • Ich bin nicht in der Lage eine AVG (COUNT (Stadt)) zu tun - verkanten zwei Aggregatfunktion
  • Ich bin auch nicht sicher, wie es durch die Summe der Anzahl der Städte zu teilen (= 9) .
  • Nicht sicher, ob ich Unions oder Joins oder Unterabfragen verwenden sollte.

Ich versuche, von so etwas wie

  • wählen Stadt, inner_count_city/sum (inner_count_city) zu tun ..
+0

Welche DBMS sind Sie mit? – sagi

Antwort

0

Sie AVG Aggregatfunktion in einer äußeren Abfrage anwenden können:

select avg(cnt) 
FROM (select count(city) as cnt 
     from employees 
     group by city) as t 

Um den Prozentsatz der Personen pro Stadt zu erhalten, können Sie die folgende Abfrage verwenden:

select city, count(city) * 100.0/total_count as cnt 
from employees 
cross join (select count(*) as total_count from employees) AS t 
group by city, total_count 
+0

Danke, aber was ist, wenn ich gucke, für wie viel Prozent der Leute kommen aus jeder anderen Stadt. – user2977259

+0

Der Ausdruck Nr. 2 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte "t.total_count", die funktional nicht von Spalten in der GROUP BY-Klausel abhängig ist. Dies ist inkompatibel mit sql_mode = only_full_group_by – user2977259

+0

Danke, funktioniert wie ein Charme, können Sie erläutern, warum Cross beitreten. – user2977259

0

SQL unterstützt jeweils nur eine Aggregation; Für mehrere Aggregationen benötigen Sie mehrere Unterabfragen/CTEs. Wenn Sie die durchschnittliche Zahl der Menschen in den Städten wollen, dann sind Sie fast da:

SELECT AVG(inner_count_city * 1.0) from 
FROM (SELECT city AS inner_city, COUNT(*) AS inner_count_city 
     FROM employees 
     GROUP BY inner_city 
    ) c; 

Beachten Sie, dass SQL Server tut Integer-Arithmetik mit ganzen Zahlen. Also ist der Durchschnitt von 1 und 2 1, nicht 1,5. Daher die * 1.0.

Sie können dies tun, ohne eine Unterabfrage auch:

SELECT COUNT(*) * 1.0/COUNT(DISTINCT city) 
FROM employees; 
+0

Danke, aber was, wenn ich gucke, für wie viel Prozent der Leute kommen aus jeder anderen Stadt. – user2977259