小编典典

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

sql

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

因为职员可以是多个部门的成员,所以我有第三个staff_dept带有user_no列和dept_no列的表,这是另两个表的主键。该表显示了每个员工所属的部门,并且每个用户/部门交叉口都包含一行。

我希望以电子表格的形式输出(CSV文件,无论如何;我将结果精巧地整理成可用的形式),每个部门一列,每个部门一行用户,并X在每个交叉路口出现,如中所定义staff_dept

我可以编写一个可以实现此结果的SQL查询吗?还是我必须做一些“真实的”编程(因为直到您嵌套了三个或四个for循环,否则它才是“真实的”程序)才能收集和格式化此数据?


阅读 171

收藏
2021-04-22

共1个答案

小编典典

可以使用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
2021-04-22