将每个唯一ID的多行合并为单行,并在SQL Server的视图中具有多个索引列名

问题描述 投票:0回答:1

在MS SQL Server 2016中,我具有以下几列的视图vw_PERSON_COMPANY_CONTACT_INFO

,[COMPANY_ID]
,[PERSON_ID]
,[PERSON_NAME]
,[TITLE]
,[ADDRESS_ID]
,[ADDRESS_LINE_1]
,[ADDRESS_LINE_2]
,[ADDRESS_LINE_3]
,[CITY]
,[PROVINCE_STATE]
,[COUNTRY]
,[POSTAL_CODE]
,[EMAIL_ID]
,[EMAIL_ADDRESS]
,[PHONE_ID]
,[PHONE_NUMBER]
,[EXT]

[每一行代表各个员工的个人和联系信息。一些公司只能只有一个员工,其他公司则只有几十个。

[我希望能够创建另一个视图vw_COMPANY_CONTACTS,将所有人员/联系信息(COMPANY_ID以外的所有内容,都将由该行中的所有条目共享)组合为每个唯一COMPANY_ID的一行找到的前7名员工。每个列名都可能会被重命名并以从1开始的索引递增。例如,我将第一个雇员的ADDRESS_LINE_1设置为[Address1a],将第二个雇员的设置为[Address2a],将第三个雇员的设置为[Address3a]等等

创建这种视图的最有效方法是什么?

sql sql-server view group-by pivot
1个回答
1
投票

您可以使用rown_number()和条件聚合。

逻辑类似于:

create view vw_COMPANY_CONTACTS as
select
    company_id,
    max(case when rn = 1 then person_id end) person_id_1,
    max(case when rn = 1 then title end) title_1,
    -- other columns for the contact n°1 go here
    max(case when rn = 2 then person_id end) person_id_2,
    max(case when rn = 2 then title end) title_2,
    -- other columns for the contact n°2 go here
from (
    select t.*, row_number() over(partition by company_id order by person_id) rn
    from vw_PERSON_COMPANY_CONTACT_INFO t
) t
group by company_id
© www.soinside.com 2019 - 2024. All rights reserved.