我有以下使用SSMS 2012的MS SQL查詢。我一直在微調和調整一段時間。你可以在這裏瞭解更多。將case語句添加到大型查詢以允許結果集更加動態
CASE statement in monster query
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應用的一部分被硬編碼查詢。不過,我想引用查詢
[APXFirm]使用的查看聯繫人的CASE語句或某些類型的布爾邏輯的。[AdvApp] [vContact]
在聯繫人視圖上面提到的是列電子郵件3。如果Email3的值是[email protected],我希望替代使用Cover_EmailSSRS的contentsetname列中的Cover_SSRS。因此,在相同的結果集,如果EMAIL3的值[email protected]結果集將如下所示:
謝謝
我在那裏看不到問題?你有沒有嘗試添加你對它們感興趣的案例?或者,也許你可以用適當的替換動態地構建整個查詢並執行字符串?或者使用參數/變量? –
我以前曾嘗試將case語句添加到以FROM數據d開頭的查詢的較低部分。這是查詢的一部分,我不太瞭解,也沒有成功。問題是,如果Email3的值爲[email protected] –
我如何獲得結果集在contentsetname行中顯示Cover_EmailSSRS我也懷疑整個查詢可能更簡單但不知道如何構建。 –