[英]SQL Query to group multiple items with the same index into the same row
因此,我有三个表,其中包含有关用户及其部门的数据,我需要创建一个查询,以组织用户之间的数据。 第一个表包含用户的名称和ID,如下所示:
user_name user_id
-----------------------
bob 1
chuck 2
bill 3
下表对用户及其部门ID进行了索引,如下所示:
user_id department_id
-----------------------------
1 x
1 y
2 x
3 z
2 z
2 y
最后一张表格根据其ID列出了部门名称:
department_id department_name
-------------------------------
x research
y development
z advertising
如何编写一个查询,列出所有用户以及他们所在的每个部门? 它看起来应该像这样:
user_name user_id department_1 department_2 department_3
----------------------------------------------------------------------------
bob 1 research development
chuck 2 research development advertising
bill 3 advertising
我尝试了许多不同的方法,但找不到任何可以提供此结果的方法。 我的输出当前列出重复的用户(如果他们有多个部门),例如:
user_name user_id department_1 department_2 department_3
----------------------------------------------------------------------------
bob 1 research research research
bob 1 development development development
chuck 2 research research research
chuck 2 development development development
chuck 3 advertising advertising advertising
bill 3 advertising advertising advertising
当前代码:
WITH DATA AS
(
SELECT
Users.user_name AS Name,
Users.user_id AS Id,
Departments.department_name AS Department1,
Departments.department_name AS Department2,
Departments.department_name AS Department3
FROM Users
JOIN Department_Index ON Users.user_id = Department_Index.user_id
JOIN Departments ON Departments.department_id = Department_Index.department_id
WHERE Departments.department_id = Department_Index.department_id
)
SELECT
Name,Id,Department1,Department2,Department3
FROM DATA
我也尝试过这样的事情
WITH DATA AS
(
SELECT
Users.user_name AS Name,
Users.user_id AS Id,
( SELECT Departments.department_name
FROM Departments
JOIN Department_Index ON Department_Index.user_id = Users.user_id
WHERE Departments.department_name = Department_Index.department_name
) AS Departments
FROM Users
)
SELECT
Name,Id,Departments[0],Departments[1],Departments[2]
FROM DATA
但这也不起作用。
任何帮助表示赞赏!
在您告诉我们表名之前,我已经写了这个。
关键是使用row_number()窗口函数对部门名称进行排序,然后再加入此CTE 3次。
with ud_numbered as
(
select u.user_id, ud.department_id, d.department_name
row_number() over (partition by u.user_id order by ud.department_id asc) as dept_no
from user_table u
left join user_departement ud on u.user_id = ud1.user_id
left join department d on ud.department_id = d.department_id
)
select u.user_id, u.user_name, n1.department_name as department_1,
n2.department_name as department_2,
n3.department_name as department_3
from user_table u
left join ud_numbered n1 on u.user_id = n1.user_id and n1.dept_no = 1
left join ud_numbered n2 on u.user_id = n2.user_id and n2.dept_no = 2
left join ud_numbered n3 on u.user_id = n3.user_id and n3.dept_no = 3
我个人将使用ROW_NUMBER()
和PIVOT
来解决这个问题。 ROW_NUMBER()
将为每个部门提供一个人的唯一标识符,从1开始,然后您可以使用该标识符进行修改。 所使用的聚合函数,在这种情况下, MAX
是因为任意的,如规定的标识符是唯一的,所以你正在服用的MAX
单值:
WITH UserData AS
( SELECT u.[user_id],
u.[user_name],
d.department_name,
RowNumber = ROW_NUMBER() OVER(PARTITION BY u.[user_id] ORDER BY d.department_id)
FROM Users AS u
INNER JOIN Department_Index AS di
ON di.user_id = u.user_id
INNER JOIN Departments AS d
ON d.department_id = di.department_id
)
SELECT pvt.[user_id],
pvt.[user_name],
Department1 = pvt.[1],
Department2 = pvt.[2],
Department3 = pvt.[3]
FROM Data AS d
PIVOT
( MAX(department_name)
FOR RowNumber IN ([1], [2], [3])
) AS pvt;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.