sql - PostgreSQL 9.3 : Pivot table query

标签 sql postgresql pivot-table postgresql-9.3 table-functions

我想显示给定下表的数据透视表(交叉表)。

表:员工

CREATE TABLE Employee
(
Employee_Number varchar(10),
Employee_Role varchar(50),
Group_Name varchar(10)
);

插入:

INSERT INTO Employee VALUES('EMP101','C# Developer','Group_1'),
                           ('EMP102','ASP Developer','Group_1'),
                           ('EMP103','SQL Developer','Group_2'),
                           ('EMP104','PLSQL Developer','Group_2'),
                           ('EMP101','Java Developer',''),
                           ('EMP102','Web Developer','');

现在我想显示上述数据的数据透视表,如下所示:

预期结果:

Employee_Number     TotalRoles      TotalGroups       Available     Others     Group_1     Group_2
---------------------------------------------------------------------------------------------------
   EMP101               2                2                1           1           1           0
   EMP102               2                2                1           1           1           0
   EMP103               1                2                1           0           0           1 
   EMP104               1                2                1           0           0           1

说明:我想显示每个员工拥有的Employee_NumberTotalRolesTotalGroups 显示给所有员工,Available 显示可用的员工 在多少个组中,Others 必须显示该员工在其他组中也有空 group_name 尚未分配,最后 Group_Names 必须以数据透视格式显示。

最佳答案

SELECT * FROM crosstab(
      $$SELECT grp.*, e.group_name
             , CASE WHEN e.employee_number IS NULL THEN 0 ELSE 1 END AS val
        FROM  (
           SELECT employee_number
                , count(employee_role)::int            AS total_roles
                , (SELECT count(DISTINCT group_name)::int
                   FROM   employee
                   WHERE  group_name <> '')            AS total_groups
                , count(group_name <> '' OR NULL)::int AS available
                , count(group_name =  '' OR NULL)::int AS others
           FROM   employee
           GROUP  BY 1
           ) grp
        LEFT   JOIN employee e ON e.employee_number = grp.employee_number
                              AND e.group_name <> ''
        ORDER  BY grp.employee_number, e.group_name$$
     ,$$VALUES ('Group_1'::text), ('Group_2')$$
   ) AS ct (employee_number text
          , total_roles  int
          , total_groups int
          , available    int
          , others       int
          , "Group_1"    int
          , "Group_2"    int);

SQL Fiddle演示基本查询,但不演示 sqlfiddle.com 上未安装的交叉表步骤

交叉表的基础知识:

此交叉表的特殊之处:所有“额外”列。这些列位于中间,在“行名”之后但在“类别”和“值”之前:

再一次,如果您有一组动态组,则需要动态构建此语句并在第二次调用中执行它:

关于sql - PostgreSQL 9.3 : Pivot table query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29071443/

相关文章:

java - 使用hibernate读取300万条记录

postgresql - Postgres 序列对代码和 pgAdmin 的 react 不同

python - pd.pivot_table 如何/在哪里存储或引用其索引和列变量的名称?

postgresql - postgres中的递归函数

mysql - Eloquent 枢轴 : how to do select columns in Laravel 5. 1

php - Laravel 一对多关系

mysql - 选择不同数据的计数

java - "java.sql.SQLException: [Amazon](500310) Invalid operation: syntax error at end of input"用于使用 JDBC 的 redshift 查询

sql - 在 sequelize 中,如何选择与我正在搜索的所有值匹配的记录?

pandas - 删除编码 "UTF8": 0x00 chars from pandas dataframe for psycopg2 cursor