自定义处理以将行转换为 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;