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

在SQL Server中,将每个唯一ID的多行合并为一行,并在视图中使用多个索引列名,sql,sql-server,pivot,window-functions,sql-view,Sql,Sql Server,Pivot,Window Functions,Sql View,在MS SQL Server 2016中,我有一个视图,vw\u PERSON\u COMPANY\u CONTACT\u 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] ,[EMA

在MS SQL Server 2016中,我有一个视图,
vw\u PERSON\u COMPANY\u CONTACT\u 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\u LINE\u 1
作为
[Address1a]
,第二名员工的
[Address2a]
,第三名员工的
[Address3a]
,等等


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

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

您不希望创建从其他视图中进行选择的视图。这似乎很合乎逻辑,但绝对会削弱您的性能。谢谢你的反馈,肖恩。这会管用的,但是嵌套视图对性能很糟糕。我使用了这个逻辑,没有使用嵌套视图,它工作得非常好。谢谢。@MiniG34:Sean Lange是正确的,您应该避免嵌套视图。最好直接查询视图的源表。