在SQL Server中,将每个唯一ID的多行合并为一行,并在视图中使用多个索引列名
在MS SQL Server 2016中,我有一个视图,在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
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是正确的,您应该避免嵌套视图。最好直接查询视图的源表。