我有一个包含工作人员的staff
数据库表,其中包含user_no
和user_name
列。我有另一个department
表,其中包含员工可以成为其成员的部门,其中dept_no
和dept_name
为列。
由于员工可以是多个部门的成员,因此我有第三个staff_dept
表,其中包含user_no
列和dept_no
列,这些是其他两个列的主键表。此表显示每个员工所属的部门,每个用户/部门交叉点包含一行。
我希望以电子表格的形式输出一个输出(CSV文件,无论如何;我会很好地将结果变成一个可用的表格,我得到它们),每个部门有一列,还有一个每个用户的行,X
出现在每个十字路口,如staff_dept
中所定义。
我可以写一个SQL查询来实现这个结果吗?或者我必须做一些“真正的”编程(因为它不是一个“真正的”程序,直到你嵌套了三个或四个for
循环,显然)来收集和格式化这些数据?
答案 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 - 这是一个不透明的陈述,但概念几乎相同。