我有以下使用 SSMS 2012 的 MS SQL 查询。我已经微调和调整了一段时间。你可以在这里了解更多。
WITH Data AS
( SELECT b.ReportHeading1,
p.DisplayOrder,
p.MemberCode,
m.PortfolioGroupCode as DistGroup,
m.PortfolioGroupCode as DistCode,
m.MemberCode as Packgroup,
g.purpose,
gg.purpose as purpose2,
c.DeliveryName,
p.PortfolioGroupID as pid,
m.PortfolioGroupID as mid,
convert(varchar(max),lb.value) as repset,
RowNumber = ROW_NUMBER() OVER(PARTITION BY m.portfoliogroupid, m.membercode ORDER BY p.DisplayOrder)
FROM [APXFirm].[AdvApp].[vPortfolioGroupMemberFlattened] p
LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioBase] b
ON b.PortfolioBaseID = p.PortfolioGroupID
LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioGroupMember] m
on m.MemberID = p.PortfolioGroupID
LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioGroup] g
ON g.PortfolioGroupID = m.PortfolioGroupID
LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioGroup] gg
ON m.MemberCode = gg.PortfolioGroupCode
LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioBaseLabels] lb
on p.MemberID = lb.PortfolioBaseID
LEFT OUTER JOIN [APXFirm].[AdvApp].[vContact] c
on c.ContactCode = g.Purpose
WHERE m.PortfolioGroupCode like '%_Dist%'
and (g.Purpose like '%_ind' or g.Purpose like '%group')
and lb.Label = '$repset'
--and m.membercode like '%pack%'
)
SELECT
t.ContentSetName,
'' as 'DistributionDesc',
CASE WHEN ISNULL(d.purpose2,'.') <> ISNULL(d.purpose,'.')
THEN CAST(d.ReportHeading1+'_ - '+d.DeliveryName AS NVARCHAR(MAX))
ELSE d.ReportHeading1+'_' END AS DistributionCustom,
CONCAT(d.mid,'.',d.pid,'_',d.DisplayOrder,'_',
CASE
WHEN t.ContentSetName LIKE 'Cover%' THEN 'Cover'
WHEN t.ContentSetName = 'Separator_docx' THEN 'Separator'
WHEN t.ContentSetName LIKE '%Report%' THEN 'Report'
END
,'_',d.purpose) as DistributionName,
'False' as IsForFunctionalGroup,
'True' as IsLandscapePageNum,
1 as NumOfCopies,
d.purpose as RecipientCode,
d.ReportHeading1 as RecipientFullName,
d.MemberCode as ReportingEntityCode,
'Quarterly' as RunEvent
FROM Data d
CROSS APPLY
( VALUES
('Cover_SSRS'),
('Separator_docx'),
(d.repset)
) t (ContentSetName)
WHERE d.RowNumber = 1
OR t.ContentSetNAme != 'Cover_SSRS'
这是它产生的结果集..
正如您在内容集中可能注意到的那样,Cover_SSRS在查询的 CROSS APPLY 部分中是硬编码的。但是我想要一个 CASE 语句或某种类型的布尔逻辑,它引用查询中使用的联系人视图
[APXFirm].[AdvApp].[vContact]
在上面提到的联系人视图中是列Email3。如果 Email3 的值为 yes@yes.com,我希望替代使用 Cover_EmailSSRS 的 contentsetname 列中的Cover_SSRS。因此,在同一结果集中,如果 Email3 的值为 yes@yes.com,结果集将如下所示:
谢谢