我有一个staff数据库表,其中包含工作人员user_no以及和user_name列。我还有另一个department表,其中包含人员可以作为其成员的部门,具有dept_no和dept_name作为列。
staff
user_no
user_name
department
dept_no
dept_name
因为职员可以是多个部门的成员,所以我有第三个staff_dept带有user_no列和dept_no列的表,这是另两个表的主键。该表显示了每个员工所属的部门,并且每个用户/部门交叉口都包含一行。
staff_dept
我希望以电子表格的形式输出(CSV文件,无论如何;我将结果精巧地整理成可用的形式),每个部门一列,每个部门一行用户,并X在每个交叉路口出现,如中所定义staff_dept。
X
我可以编写一个可以实现此结果的SQL查询吗?还是我必须做一些“真实的”编程(因为直到您嵌套了三个或四个for循环,否则它才是“真实的”程序)才能收集和格式化此数据?
for
可以使用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
sp_executesql