PostgreSQL - Group by

  • 简述

    PostgreSQLGROUP BY子句与 SELECT 语句配合使用,将表中具有相同数据的行组合在一起。这样做是为了消除适用于这些组的输出和/或计算聚合中的冗余。
    GROUP BY 子句在 SELECT 语句中的 WHERE 子句之后,在 ORDER BY 子句之前。
  • 句法

    GROUP BY 子句的基本语法如下。GROUP BY 子句必须跟在 WHERE 子句中的条件之后,并且如果使用了 ORDER BY 子句,则必须在 ORDER BY 子句之前。
    
    SELECT column-list
    FROM table_name
    WHERE [ conditions ]
    GROUP BY column1, column2....columnN
    ORDER BY column1, column2....columnN
    
    您可以在 GROUP BY 子句中使用多个列。确保您用于分组的任何列,该列应该在列列表中可用。
  • 例子

    考虑具有以下记录的表< COMPANY -
    
    # select * from COMPANY;
     id | name  | age | address   | salary
    ----+-------+-----+-----------+--------
      1 | Paul  |  32 | California|  20000
      2 | Allen |  25 | Texas     |  15000
      3 | Teddy |  23 | Norway    |  20000
      4 | Mark  |  25 | Rich-Mond |  65000
      5 | David |  27 | Texas     |  85000
      6 | Kim   |  22 | South-Hall|  45000
      7 | James |  24 | Houston   |  10000
    (7 rows)
    
    如果您想知道每个客户的工资总额,那么 GROUP BY 查询将如下 -
    
    testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME;
    
    这将产生以下结果 -
    
      name  |  sum
     -------+-------
      Teddy | 20000
      Paul  | 20000
      Mark  | 65000
      David | 85000
      Allen | 15000
      Kim   | 45000
      James | 10000
    (7 rows)
    
    现在,让我们使用以下 INSERT 语句在 COMPANY 表中创建另外三个记录 -
    
    INSERT INTO COMPANY VALUES (8, 'Paul', 24, 'Houston', 20000.00);
    INSERT INTO COMPANY VALUES (9, 'James', 44, 'Norway', 5000.00);
    INSERT INTO COMPANY VALUES (10, 'James', 45, 'Texas', 5000.00);
    
    现在,我们的表有以下具有重复名称的记录 -
    
      id | name  | age | address      | salary
     ----+-------+-----+--------------+--------
       1 | Paul  |  32 | California   |  20000
       2 | Allen |  25 | Texas        |  15000
       3 | Teddy |  23 | Norway       |  20000
       4 | Mark  |  25 | Rich-Mond    |  65000
       5 | David |  27 | Texas        |  85000
       6 | Kim   |  22 | South-Hall   |  45000
       7 | James |  24 | Houston      |  10000
       8 | Paul  |  24 | Houston      |  20000
       9 | James |  44 | Norway       |   5000
      10 | James |  45 | Texas        |   5000
    (10 rows)
    
    同样,让我们​​使用相同的语句使用 NAME 列对所有记录进行分组,如下所示 -
    
    testdb=# SELECT NAME, SUM(SALARY) FROM COMPANY GROUP BY NAME ORDER BY NAME;
    
    这将产生以下结果 -
    
     name  |  sum
    -------+-------
     Allen | 15000
     David | 85000
     James | 20000
     Kim   | 45000
     Mark  | 65000
     Paul  | 40000
     Teddy | 20000
    (7 rows)
    
    让我们使用 ORDER BY 子句和 GROUP BY 子句,如下所示 -
    
    testdb=#  SELECT NAME, SUM(SALARY)
             FROM COMPANY GROUP BY NAME ORDER BY NAME DESC;
    
    这将产生以下结果 -
    
     name  |  sum
    -------+-------
     Teddy | 20000
     Paul  | 40000
     Mark  | 65000
     Kim   | 45000
     James | 20000
     David | 85000
     Allen | 15000
    (7 rows)