2014-04-04 19 views
0

我有以下使用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' 

這是結果集它產生..

table

正如你可以在內容設置注Cover_SSRS在CROSS應用的一部分被硬編碼查詢。不過,我想引用查詢

[APXFirm]使用的查看聯繫人的CASE語句或某些類型的布爾邏輯的。[AdvApp] [vContact]

Contact View

在聯繫人視圖上面提到的是列電子郵件3。如果Email3的值是[email protected],我希望替代使用Cover_EmailSSRS的contentsetname列中的Cover_SSRS。因此,在相同的結果集,如果EMAIL3的值[email protected]結果集將如下所示:

Result2

謝謝

+0

我在那裏看不到問題?你有沒有嘗試添加你對它們感興趣的案例?或者,也許你可以用適當的替換動態地構建整個查詢並執行字符串?或者使用參數/變量? –

+0

我以前曾嘗試將case語句添加到以FROM數據d開頭的查詢的較低部分。這是查詢的一部分,我不太瞭解,也沒有成功。問題是,如果Email3的值爲[email protected] –

+0

我如何獲得結果集在contentsetname行中顯示Cover_EmailSSRS我也懷疑整個查詢可能更簡單但不知道如何構建。 –

回答

1

既然你已經引用[APXFirm]在您的CTE中[AdvApp]。[vContact]視圖,爲什麼不簡單地將Email3-column添加爲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 = '[email protected]' 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' 
+0

您能否使用整個查詢顯示這些版本的位置? –

+0

當然 - 看看我編輯的答案。 – Dan

+0

該查詢可以工作,但會使Cover_EmailSSRS值重複太多請點擊此處http://i.imgur.com/oLo2cKV.jpg –