自定义处理以将行转换为 SQL 中的列
Customized processing to convert rows to Columns in SQL
我知道已经有人问过很多关于 SQL table 格式的问题,但我找不到解决我当前问题的方法。
我的问题是,我有一个 table 包含有关公司的数据以及与这些公司关联的员工。
Company_ID Person_ID Name Departement_ID
1 1 aaa 1
1 2 bbb 1
1 3 ccc 1
1 4 ddd 2
2 5 eee 1
2 6 fff 2
2 7 ggg 2
我想显示每家公司每个部门 2 名员工数据的样本。部门 1 的结果将是这样的:
Company_ID Contact1ID_Dpt1 Contact1Name_Dpt1 Contact2ID_Dpt1 Contact2Name_Dpt1
1 1 aaa 2 bbb
2 5 eee NULL NULL
有人可以帮我解决这个问题吗?
这是一个数据透视示例,可以使用 row_number()
和条件聚合轻松完成。
select company_id, department_id,
max(case when seqnum = 1 then name end) as name1,
max(case when seqnum = 2 then name end) as name1.
from (select t.*,
row_number() over (company_id, department_id order by newid()) as seqnum
from t
) t
group by company_id, department_id;
如果愿意,您可以添加一个过滤器以仅获取一个部门。
类似于 Gordon 的示例,但您实际上不需要在分组依据或 row_number() 中包含部门。如果您想添加部门过滤器,您可以将其添加到子查询中..
DECLARE @Table1 TABLE (
Company_ID INT,
Person_ID INT,
[Name] VARCHAR(MAX),
Departement_ID INT
)
INSERT INTO @Table1
VALUES
(1,1,'aaa',1),
(1,2,'bbb',1),
(1,3,'ccc',1),
(1,4,'ddd',2),
(2,5,'eee',1),
(2,6,'fff',2),
(2,7,'ggg',2)
DECLARE @Departement INT = 1
SELECT
Company_ID,
MAX(CASE WHEN seqnum = 1 THEN Person_ID END) AS Contact1ID_Dpt,
MAX(CASE WHEN seqnum = 1 THEN [Name] END) AS Contact1Name_Dpt,
MAX(CASE WHEN seqnum = 2 THEN Person_ID END) AS Contact2ID_Dpt,
MAX(CASE WHEN seqnum = 2 THEN [Name] END) AS Contact2Name_Dpt
FROM
(SELECT
t.*,
ROW_NUMBER () OVER (PARTITION BY Company_ID ORDER BY Person_ID) AS seqnum
FROM
@Table1 t
WHERE --add your department filter here.
Departement_ID = @Departement
) t
GROUP BY
Company_ID;
我知道已经有人问过很多关于 SQL table 格式的问题,但我找不到解决我当前问题的方法。
我的问题是,我有一个 table 包含有关公司的数据以及与这些公司关联的员工。
Company_ID Person_ID Name Departement_ID
1 1 aaa 1
1 2 bbb 1
1 3 ccc 1
1 4 ddd 2
2 5 eee 1
2 6 fff 2
2 7 ggg 2
我想显示每家公司每个部门 2 名员工数据的样本。部门 1 的结果将是这样的:
Company_ID Contact1ID_Dpt1 Contact1Name_Dpt1 Contact2ID_Dpt1 Contact2Name_Dpt1
1 1 aaa 2 bbb
2 5 eee NULL NULL
有人可以帮我解决这个问题吗?
这是一个数据透视示例,可以使用 row_number()
和条件聚合轻松完成。
select company_id, department_id,
max(case when seqnum = 1 then name end) as name1,
max(case when seqnum = 2 then name end) as name1.
from (select t.*,
row_number() over (company_id, department_id order by newid()) as seqnum
from t
) t
group by company_id, department_id;
如果愿意,您可以添加一个过滤器以仅获取一个部门。
类似于 Gordon 的示例,但您实际上不需要在分组依据或 row_number() 中包含部门。如果您想添加部门过滤器,您可以将其添加到子查询中..
DECLARE @Table1 TABLE (
Company_ID INT,
Person_ID INT,
[Name] VARCHAR(MAX),
Departement_ID INT
)
INSERT INTO @Table1
VALUES
(1,1,'aaa',1),
(1,2,'bbb',1),
(1,3,'ccc',1),
(1,4,'ddd',2),
(2,5,'eee',1),
(2,6,'fff',2),
(2,7,'ggg',2)
DECLARE @Departement INT = 1
SELECT
Company_ID,
MAX(CASE WHEN seqnum = 1 THEN Person_ID END) AS Contact1ID_Dpt,
MAX(CASE WHEN seqnum = 1 THEN [Name] END) AS Contact1Name_Dpt,
MAX(CASE WHEN seqnum = 2 THEN Person_ID END) AS Contact2ID_Dpt,
MAX(CASE WHEN seqnum = 2 THEN [Name] END) AS Contact2Name_Dpt
FROM
(SELECT
t.*,
ROW_NUMBER () OVER (PARTITION BY Company_ID ORDER BY Person_ID) AS seqnum
FROM
@Table1 t
WHERE --add your department filter here.
Departement_ID = @Departement
) t
GROUP BY
Company_ID;