繁体   English   中英

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

[英]Combining multiple rows for each unique ID as a single row with multiple indexed column names in a view in SQL Server

在 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]对于第三等.

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

您可以使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM