2

我有一个staff包含工作人员的数据库表,其中包含user_nouser_name列。我有另一个department表,其中包含员工可以成为成员的部门,dept_nodept_name作为列。

因为员工可以是多个部门的成员,所以我有第三个staff_dept表,其中有一user_no列和一dept_no列,它们是其他两个表的主键。此表显示每个员工所属的部门,并包含每个用户/部门交叉点的一行。

我想有一个电子表格形式的输出(CSV文件,无论如何;我会很好地将结果整理成可用的形式),每个部门一列,每个部门一行用户,X在每个交叉点出现 ,如 中所定义staff_dept

我可以编写一个 SQL 查询来实现这个结果吗?还是我必须做一些“真正的”编程(因为它不是一个“真正的”程序,除非你嵌套了三个或四个for循环,显然)来收集和格式化这些数据?

4

2 回答 2

5

这可以通过 PIVOT 表(使用 SQL Server)来完成:

SELECT user_name, [dept1name], [dept2name], [dept3name], ...
FROM
    (SELECT s.user_name, d.dept_name,
     case when sd.user_no is not null then 'X' else '' end as matches
     from staff s
     cross join department d
     left join staff_dept sd on s.user_no = sd.user_no and d.dept_no = sd.dept_no
    ) AS s
PIVOT
(
    min(matches)
    FOR dept_name IN ([dept1name], [dept2name], [dept3name], ...)
) AS pvt
order by user_name

演示:http ://www.sqlfiddle.com/#!3/c136d/5

编辑:要从表中的部门列表动态生成 PIVOT 查询,您将使用动态 SQL,即将代码生成到变量中并使用sp_executesql辅助存储过程。这是一个例子:http ://www.sqlfiddle.com/#!3/c136d/14

于 2012-04-26T13:59:19.280 回答
1

在 SQL Server 中(如果您使用的是 SQL Server),我将从完全外部联接开始(包括所有员工和部门,而不仅仅是关系中涉及的人员),将其放入数据透视语句中,以将所有部门转换为列,然后构建一个简短的脚本来生成并动态执行该 SELECT 语句(因为枢轴语句创建的列必须是硬编码的,它们不能在运行时动态生成)。

这是一个示例——这是一个不重要的陈述,但概念几乎相同。

于 2012-04-26T14:01:08.867 回答