我有一个SQL选择,我正在尝试将其设置为View以用作另一个脚本中的查找。该视图有14列,其中一列是'RelationshipCode'。这可能是4种可能的代码之一。我的数据目前有订单ID,联系人的13列数据(名称,地址等),但我想要的是订单ID,以及这4个代码中的每一个的12列数据。
当前选择:
SELECT [OC].[OrderId]
, [OC].[ContactFirstName]
, [OC].[ContactLastName]
, [OC].[Name]
, [OC].[Address1]
, [OC].[Address2]
, [OC].[City]
, [OC].[State]
, [OC].[ZIP]
, [OC].[RelationshipCode]
, [OC].[ContactLookUpCode]
, [OC].[ContactEmail]
, [OC].[IsMarketingSource]
, [CI].[UserID]
FROM [dbo].[OrderContact] AS OC
INNER JOIN [dbo].[Order] AS O
ON [O].[Id] = [OC].[OrderId]
LEFT JOIN [dbo].[ContactInformation] AS CI
ON [CI].[ContactData] = [OC].[ContactEmail]
LEFT JOIN [dbo].[Users] AS U
ON [U].[UserID] = [CI].[UserID]
AND [U].[Disabled] = 0
WHERE ( ( [OC].[RelationshipCode] = 'L' )
OR ( [OC].[RelationshipCode] = 'SB' )
OR ( [OC].[RelationshipCode] = 'LB' )
OR ( [OC].[RelationshipCode] = 'M' ) );
订单联系人数据的示例
我正在寻找的是具有如下列的输出:
SELECT [OC].[OrderId]
, [OC].[ContactFirstName] AS [L_FirstName]
, [OC].[ContactLastName] AS [L_LastName]
, [OC].[Name] AS [L_Name]
, [OC].[Address1] AS [L_Address1]
, [OC].[Address2] AS [L_Address2]
, [OC].[City] AS [L_City]
, [OC].[State] AS [L_State]
, [OC].[ZIP] AS [L_Zip]
, [OC].[RelationshipCode] AS [L_RelationshipCode]
, [OC].[ContactLookUpCode] AS [L_LookupCode]
, [OC].[ContactEmail] AS [L_Email]
, [OC].[IsMarketingSource] AS [L_IsMarketingSource]
, [CI].[UserID] AS [L_UserId]
, [OC].[ContactFirstName] AS [SB_FirstName]
, [OC].[ContactLastName] AS [SB_LastName]
, [OC].[Name] AS [SB_Name]
, [OC].[Address1] AS [SB_Address1]
, [OC].[Address2] AS [SB_Address2]
, [OC].[City] AS [SB_City]
, [OC].[State] AS [SB_State]
, [OC].[ZIP] AS [SB_Zip]
, [OC].[RelationshipCode] AS [SB_RelationshipCode]
, [OC].[ContactLookUpCode] AS [SB_LookupCode]
, [OC].[ContactEmail] AS [SB_Email]
, [OC].[IsMarketingSource] AS [SB_IsMarketingSource]
, [CI].[UserID] AS [SB_UserId]
, [OC].[ContactFirstName] AS [LB_FirstName]
, [OC].[ContactLastName] AS [LB_LastName]
, [OC].[Name] AS [LB_Name]
, [OC].[Address1] AS [LB_Address1]
, [OC].[Address2] AS [LB_Address2]
, [OC].[City] AS [LB_City]
, [OC].[State] AS [LB_State]
, [OC].[ZIP] AS [LB_Zip]
, [OC].[RelationshipCode] AS [LB_RelationshipCode]
, [OC].[ContactLookUpCode] AS [LB_LookupCode]
, [OC].[ContactEmail] AS [LB_Email]
, [OC].[IsMarketingSource] AS [LB_IsMarketingSource]
, [CI].[UserID] AS [LB_UserId]
, [OC].[ContactFirstName] AS [M_FirstName]
, [OC].[ContactLastName] AS [M_LastName]
, [OC].[Name] AS [M_Name]
, [OC].[Address1] AS [M_Address1]
, [OC].[Address2] AS [M_Address2]
, [OC].[City] AS [M_City]
, [OC].[State] AS [M_State]
, [OC].[ZIP] AS [M_Zip]
, [OC].[RelationshipCode] AS [M_RelationshipCode]
, [OC].[ContactLookUpCode] AS [M_LookupCode]
, [OC].[ContactEmail] AS [M_Email]
, [OC].[IsMarketingSource] AS [M_IsMarketingSource]
, [CI].[UserID] AS [M_UserId]
这个想法是我在一条记录上有一个订单ID,以及随之而来的所有联系人。 (试图阻止最终用户界面上的一些N + 1问题。)
答案 0 :(得分:1)
一种方法是进行条件聚合:
SELECT [OC].[OrderId]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[ContactFirstName] END) AS [L_FirstName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[ContactLastName] END) AS [L_LastName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[Name] END) AS [L_Name]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[Address1] END) AS [L_Address1]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[Address2] END) AS [L_Address2]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[City] END) AS [L_City]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[State] END) AS [L_State]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[ZIP] END) AS [L_Zip]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[RelationshipCode] END) AS [L_RelationshipCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[ContactLookUpCode] END) AS [L_LookupCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[ContactEmail] END) AS [L_Email]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [OC].[IsMarketingSource] END) AS [L_IsMarketingSource]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'L' THEN [CI].[UserID] END) AS [L_UserId]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[ContactFirstName] END) AS [SB_FirstName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[ContactLastName] END) AS [SB_LastName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[Name] END) AS [SB_Name]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[Address1] END) AS [SB_Address1]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[Address2] END) AS [SB_Address2]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[City] END) AS [SB_City]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[State] END) AS [SB_State]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[ZIP] END) AS [SB_Zip]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[RelationshipCode] END) AS [SB_RelationshipCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[ContactLookUpCode] END) AS [SB_LookupCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[ContactEmail] END) AS [SB_Email]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [OC].[IsMarketingSource] END) AS [SB_IsMarketingSource]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'SB' THEN [CI].[UserID] END) AS [SB_UserId]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[ContactFirstName] END) AS [LB_FirstName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[ContactLastName] END) AS [LB_LastName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[Name] END) AS [LB_Name]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[Address1] END) AS [LB_Address1]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[Address2] END) AS [LB_Address2]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[City] END) AS [LB_City]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[State] END) AS [LB_State]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[ZIP] END) AS [LB_Zip]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[RelationshipCode] END) AS [LB_RelationshipCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[ContactLookUpCode] END) AS [LB_LookupCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[ContactEmail] END) AS [LB_Email]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [OC].[IsMarketingSource] END) AS [LB_IsMarketingSource]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'LB' THEN [CI].[UserID] END) AS [LB_UserId]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[ContactFirstName] END) AS [M_FirstName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[ContactLastName] END) AS [M_LastName]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[Name] END) AS [M_Name]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[Address1] END) AS [M_Address1]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[Address2] END) AS [M_Address2]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[City] END) AS [M_City]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[State] END) AS [M_State]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[ZIP] END) AS [M_Zip]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[RelationshipCode] END) AS [M_RelationshipCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[ContactLookUpCode] END) AS [M_LookupCode]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[ContactEmail] END) AS [M_Email]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [OC].[IsMarketingSource] END) AS [M_IsMarketingSource]
, MAX(CASE WHEN [OC].[RelationshipCode] = 'M' THEN [CI].[UserID] END) AS [M_UserId]
FROM [dbo].[OrderContact] AS OC
INNER JOIN [dbo].[Order] AS O
ON [O].[Id] = [OC].[OrderId]
LEFT JOIN [dbo].[ContactInformation] AS CI
ON [CI].[ContactData] = [OC].[ContactEmail]
LEFT JOIN [dbo].[Users] AS U
ON [U].[UserID] = [CI].[UserID]
AND [U].[Disabled] = 0
WHERE ( ( [OC].[RelationshipCode] = 'L' )
OR ( [OC].[RelationshipCode] = 'SB' )
OR ( [OC].[RelationshipCode] = 'LB' )
OR ( [OC].[RelationshipCode] = 'M' ) )
GROUP BY [OC].[OrderId]
答案 1 :(得分:1)
可以像这样避免所有CASE -WHEN-END实例,这可能是对大型数据集的性能改进。
with rawData as (
SELECT OC.[OrderId]
,OC.[ContactFirstName]
,OC.[ContactLastName]
,OC.[Name]
,OC.[Address1]
,OC.[Address2]
,OC.[City]
,OC.[State]
,OC.[ZIP]
,OC.[RelationshipCode]
,OC.[ContactLookUpCode]
,OC.[ContactEmail]
,OC.[IsMarketingSource]
,CI.[UserID]
FROM [dbo].[OrderContact] OC
JOIN [dbo].[Order] O ON O.[Id] = OC.[OrderId]
LEFT JOIN [dbo].[ContactInformation] CI ON CI.[ContactData] = OC.[ContactEmail]
LEFT JOIN [dbo].[Users] U ON U.[UserID] = CI.[UserID]
AND U.[Disabled] = 0
cross apply (values
('L'),('SB'),('LB'),('M')
unpvt(RelationshipCode)
where unpvt.RelationshipCode = OC.RelationshipCode
)
,L as (select * from rawData where relationshipCode = 'L' )
,LB as (select * from rawData where relationshipCode = 'BL' )
,SB as (select * from rawData where relationshipCode = 'SB' )
,M as (select * from rawData where relationshipCode = 'M' )
select
OC.OrderID
,isnull(L.[ContactFirstName],'') as L_ContactFirstName
,isnull(L.[ContactLastName],'') as L_ContactLastName
,isnull(L.[Name],'') as L_Name
,isnull(L.[Address1],'') as L_Address1
,isnull(L.[Address2],'') as L_Address2
,isnull(L.[City],'') as L_City
,isnull(L.[State],'') as L_State
,isnull(L.[ZIP],'') as L_ZIP
,isnull(L.[RelationshipCode],'') as L_RelationshipCode
,isnull(L.[ContactLookUpCode] ,'')as L_ContactLookUpCode
,isnull(L.[ContactEmail],'') as L_ContactEmail
,isnull(L.[IsMarketingSource],'') as L_IsMarketingSource
,isnull(SB.[UserID],'') as SB_UserID
,isnull(SB.[ContactFirstName],'') as SB_ContactFirstName
,isnull(SB.[ContactLastName],'') as SB_ContactLastName
,isnull(SB.[Name],'') as SB_Name
,isnull(SB.[Address1],'') as SB_Address1
,isnull(SB.[Address2],'') as SB_Address2
,isnull(SB.[City],'') as SB_City
,isnull(SB.[State],'') as SB_State
,isnull(SB.[ZIP],'') as SB_ZIP
,isnull(SB.[RelationshipCode],'') as SB_RelationshipCode
,isnull(SB.[ContactLookUpCode],'') as SB_ContactLookUpCode
,isnull(SB.[ContactEmail],'') as SB_ContactEmail
,isnull(SB.[IsMarketingSource],'') as SB_IsMarketingSource
,isnull(LB.[UserID],'') as LB_UserID
,isnull(LB.[ContactFirstName],'') as LB_ContactFirstName
,isnull(LB.[ContactLastName],'') as LB_ContactLastName
,isnull(LB.[Name],'') as LB_Name
,isnull(LB.[Address1],'') as LB_Address1
,isnull(LB.[Address2],'') as LB_Address2
,isnull(LB.[City] ,'') as LB_City
,isnull(LB.[State] ,'') as LB_State
,isnull(LB.[ZIP],'') as LB_ZIP
,isnull(LB.[RelationshipCode],'') as LB_RelationshipCode
,isnull(LB.[ContactLookUpCode],'') as LB_ContactLookUpCode
,isnull(LB.[ContactEmail],'') as LB_ContactEmail
,isnull(LB.[IsMarketingSource],'') as LB_IsMarketingSource
,isnull(M.[UserID],'') as M_UserID
,isnull(M.[ContactFirstName],'') as M_ContactFirstName
,isnull(M.[ContactLastName],'') as M_ContactLastName
,isnull(M.[Name],'') as M_Name
,isnull(M.[Address1],'') as M_Address1
,isnull(M.[Address2] ,'') as M_Address2
,isnull(M.[City],'') as M_City
,isnull(M.[State],'') as M_State
,isnull(M.[ZIP],'') as M_ZIP
,isnull(M.[RelationshipCode],'') as M_RelationshipCode
,isnull(M.[ContactLookUpCode],'') as M_ContactLookUpCode
,isnull(M.[ContactEmail],'') as M_ContactEmail
,isnull(M.[IsMarketingSource],'') as M_IsMarketingSource
,isnull(M.[UserID],'') as M_UserID
from [dbo].[OrderContact] OC
left join L on L.OrderID = OC.OrderID
left join SB on SB.OrderID = OC.OrderID
left join LB on LB.OrderID = OC.OrderID
left join M on M.OrderID = OC.OrderID