在 SQL 服务器的视图中将每个唯一 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
,合并所有 person/contact 信息(除了 COMPANY_ID
之外的所有信息,该行中的所有条目将共享这些信息)对于找到的前 7 名员工,每个唯一 COMPANY_ID
作为单行。每个列名都可能被重命名并按从 1 开始的索引递增。例如,我将 ADDRESS_LINE_1
As [Address1a]
用于第一个员工,As [Address2a]
用于第二个,As [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
在 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
,合并所有 person/contact 信息(除了 COMPANY_ID
之外的所有信息,该行中的所有条目将共享这些信息)对于找到的前 7 名员工,每个唯一 COMPANY_ID
作为单行。每个列名都可能被重命名并按从 1 开始的索引递增。例如,我将 ADDRESS_LINE_1
As [Address1a]
用于第一个员工,As [Address2a]
用于第二个,As [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