gpt4 book ai didi

sql - PostgreSQL 9.3 : Pivot table query

转载 作者:行者123 更新时间:2023-11-29 11:47:46 24 4
gpt4 key购买 nike

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

表:员工

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com