0

我有以下使用 SSMS 2012 的 MS SQL 查询。我已经微调和调整了一段时间。你可以在这里了解更多。

怪物查询中的 CASE 语句

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,结果集将如下所示:

结果2

谢谢

4

1 回答 1

1

既然您已经在 CTE 中引用了 [APXFirm].[AdvApp].[vContact] 视图,为什么不简单地将 Email3 列添加为 CTE 的输出列,然后在主要部分做一个简单的 CASE您的查询?

WITH Data AS
(   SELECT  c.Email3,             -- <-- Add Email3 column from vContact here.
            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
    -- Add CASE statement here --:
    CASE 
        WHEN d.Email3 = 'yes@yes.com' AND t.ContentSetName = 'Cover_SSRS' THEN 'Cover_EmailSSRS'
        ELSE t.ContentSetName
    END AS 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'
于 2014-04-04T06:08:08.170 回答