根据SQL查询生成成员的“散点图”结果

时间:2012-04-26 13:46:57

标签: sql

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

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

我希望以电子表格的形式输出一个输出(CSV文件,无论如何;我会很好地将结果变成一个可用的表格,我得到它们),每个部门有一列,还有一个每个用户的行,X出现在每个十字路口,如staff_dept中所定义。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

Here's a sample - 这是一个不透明的陈述,但概念几乎相同。