【发布时间】:2015-03-19 13:19:25
【问题描述】:
我有这些记录:
Employee_Number Employee_role Group_Name
----------------------------------------------------
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
EMP101 DBA
EMP105 DBA
EMP106 SQL Developer Group_3
EMP107 Oracle Developer Group_3
EMP101 Oracle Developer Group_3
希望以下列格式显示上述记录的数据透视表:
Employee_Number TotalRoles TotalGroups Available Others Group_1 Group_2 Group_3
-----------------------------------------------------------------------------------------------------------------
EMP101 4 3 2 2 1 1
EMP102 2 3 1 1 1
EMP103 1 3 1 0 1
EMP104 1 3 1 0 1
EMP105 1 3 0 1
EMP106 1 3 1 0 1
EMP107 1 3 1 0 1
对于上述结果,我使用以下脚本:
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 employee_number
) 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'),('Group_2'),('Group_3')$$
) AS ct (employee_number text
, total_roles int
, total_groups int
, available int
, others int
, "Group_1" int
, "Group_2" int
, "Group_3" int);
但是:现在我想通过过滤 Group_Name 来显示上述记录的数据透视表。
这意味着如果我想显示唯一 Group_Name= Group_3 的数据透视表,那么它有
仅显示仅属于 Group_Name= Group_3 的员工。
如果我只想查看属于 Group_3 的员工,而不是它必须显示给我:
Employee_Number total_roles total_groups available others Group_3
-------------------------------------------------------------------------------
EMP106 1 3 1 0 1
EMP107 1 3 1 0 1
注意:正如您在第一张表中看到的,员工 EMP106 和 EMP107 仅属于
到Group_Name = Group_3。员工EMP101 也属于但他也属于其他组
所以不应出现在此表中。
【问题讨论】:
-
您在示例中混合了
Group_1和Group_3。该说明阐明了您的意图。 -
@Erwin Brandstetter,是的!编辑完成。
-
那么,
total_roles、total_groups等还是应该基于整个表(包括其他组)?total_groups似乎很清楚,但其他人则不然。 -
@Erwin Brandstetter,是的。
total_roles,total_groups,others除available外,在整个表中都相同。available只会发生变化。 -
我看不出
available会如何变化。由于所选行没有其他组,因此在任一查询中都应该相同,对吧?
标签: sql postgresql pivot-table postgresql-9.3