2014-01-12 53 views
0

我正在使用SQL Server 2012.CASE聲明在怪物查詢中

我正在使用以下查詢來創建一個用於導入到另一個程序的自定義表。此查詢工作正常,但我需要使用case語句來完成它。

目的是有問題的列

view

目前,工作查詢。

WITH Data AS 
( SELECT b.ReportHeading1, 
      p.DisplayOrder, 
      p.MemberCode, 
      m.PortfolioGroupCode as DistGroup, 
      m.MemberCode as Packgroup, 
      g.purpose, 
      gg.Purpose as purpose2, 
      p.PortfolioGroupID as pid, 
      m.PortfolioGroupID as mid, 
      convert(varchar(max),lb.value) as repset, 
      convert(varchar(max),lb2.value) as periods, 
      RowNumber = ROW_NUMBER() OVER(PARTITION BY p.portfoliogroupid 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 gg.PortfolioGroupID = m.MemberCode 
       LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioBaseLabels] lb 
       on p.MemberID = lb.PortfolioBaseID 
           LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioBaseLabels] lb2 
       on p.MemberID = lb2.PortfolioBaseID 
       WHERE  m.PortfolioGroupCode like '%_Dist%' 
       and (g.Purpose like '%_ind' or g.Purpose like '%group') 
       and lb.Label = '$repset' 
       and lb2.Label = '$periods' 
     ) 
SELECT 
t.ContentSetName, 
d.periods as 'DistributionDesc', 
    CONCAT(d.pid,'_',d.DisplayOrder,'_',t.ContentSetName,'_',d.ReportHeading1) as DistributionName, 
      'False' as IsForFunctionalGroup, 
    'True' as IsLandscapePageNum, 
    1 as NumOfCopies, 
    d.purpose as RecipientCode, 
    d.ReportHeading1 as RecipientFullName, 
    d.MemberCode as ReportingEntityCode, 
    'Daily' 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' 

這將產生一個結果集是這樣的:

ContentSetName DistributionDesc DistributionName IsForFunctionalGroup IsLandscapePageNum NumOfCopies RecipientCode RecipientFullName ReportingEntityCode RunEvent 
Cover_SSRS 135 11221_5178_Cover_SSRS_John Smith Trusts FALSE TRUE 1 SmithJohn_ind John Smith Trusts fial3gen Daily 
Separator_docx 135 11221_5178_Separator_docx_John Smith Trusts FALSE TRUE 1 SmithJohn_ind John Smith Trusts fial3gen Daily 
Report_DVAStandardardAnnSSRS 135 11221_5178_Report_DVAStandardardAnnSSRS_John Smith Trusts FALSE TRUE 1 SmithJohn_ind John Smith Trusts fial3gen Daily 

我需要補充的是使用下面的CASE語句多了一個列

CASE WHEN d.purpose = d.purpose2 then d.purpose ELSE '' END as DistributionCustom 

我能得到這個case語句工作在一個較小的查詢中,但是在放置CASE語句後的這個大查詢中,此行後

d.periods as 'DistributionDesc', 

我得到這個錯誤。

將nvarchar值'JohnSmith_purpose'轉換爲數據類型int時轉換失敗。

我想這個CASE語句,得到了相同的錯誤結果

CASE WHEN convert(nvarchar(max),d.purpose) = convert(nvarchar(max),d.purpose2) then convert(nvarchar(max),d.purpose2) ELSE convert(nvarchar(max),'') END as DistributionCustom 

預先感謝您

+0

似乎在比較d.purpose和d.purpose2時數據類型不匹配。你能分享你的表格定義嗎? –

+0

我添加了定義 –

回答

1

既然你已經離開外連接,肯定會有零點。在SQL Server中的temp欄給出INT數據類型,如果它之前的任何字母數字值NULL -

你可以試着改變你的Data場這樣的 -

SELECT b.ReportHeading1, 
      p.DisplayOrder, 
      p.MemberCode, 
      m.PortfolioGroupCode as DistGroup, 
      m.MemberCode as Packgroup, 
      ISNULL(g.purpose,'') AS purpose, 
      ISNULL(gg.Purpose,'') as purpose2, 
... 

更新1 - 試着改變你的case語句對此 -

CASE WHEN ISNULL(d.purpose,'.') = ISNULL(d.purpose2,'.') 
    THEN CAST(d.purpose2 AS NVARCHAR(MAX)) 
    ELSE '' END AS DistributionCustom 
+0

我試過了你的建議。不幸的是仍然收到錯誤。我也添加了表格細節的圖像。 –

+1

你能否在上面的答案中嘗試更新的評論? –

+0

成功。謝謝 –