2016-10-04 53 views
0

我目前有一个电子邮件类别的列表,我列出了人,他们选择了哪些类别。动态枢轴上有子类别的类别

我现在有一个要求,每个电子邮件分类可能可能有一个分配给其链接到该类别中的一个类型的ID。

例如称为父电子邮件类别可能对链接到一类表中特定类ID列。 所以我现在需要列出所选择的类别以及“子类别”。

我的表类似于如下

Name CategoryName ClassId 
Test1 Parent  23   //23 is reception class 
Test1 General  Null 
Test2 Parent  Null 
Test3 Committee Null 
Test3 Parent  24  // 24 is year 1 

我想要些什么是

Name | Parent | Parent-Reception | Parent-Year1 | Committee | General  
Test1 | 1  | 1    | 0   | 0   | 1 
Test2 | 1  | 0    | 0   | 0   | 0 
Test3 | 1  | 0    | 1   | 1   | 0 

我使用下面的SQL只类别没有链接类得到它。

DECLARE @colsSelect AS NVARCHAR(MAX), 
@cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @colsSelect = STUFF((SELECT distinct ', ISNULL(' + QUOTENAME(c.CategoryName) + ',0) AS ' + QUOTENAME(c.CategoryName) 
      FROM dbo.EmailCategory c   
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

     SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.CategoryName) 
      FROM dbo.EmailCategory c     
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

     set @query = 'SELECT FirstName, LastName, Email, ' + @colsSelect + ' from 
      (
       SELECT DISTINCT        
          dbo.[User].Name,         
          dbo.EmailCategory.CategoryName, 
          1 as assigned 
       FROM   dbo.[User] INNER JOIN 
         dbo.EmailPreferences ON dbo.[User].ID = dbo.EmailPreferences.UserID LEFT OUTER JOIN 
         dbo.EmailCategory ON dbo.EmailPreferences.EmailCategoryID = dbo.EmailCategory.ID 
       WHERE  
        (dbo.[User].Email <> '''') AND (dbo.[User].Email IS NOT NULL)    ) x 
      pivot 
      (
       max(assigned) 
       for CategoryName in (' + @cols + ') 
      ) p ' 

      execute(@query) 

这甚至有可能使用这种类型的SQL?

+0

为什么你想'Test3'有一个'Parent'值为零? –

+0

对不起,错字。现在更新。 – Bex

回答

1

一个相当简单的(我猜)的解决方案是创建一个视图,并用它来代替当前的表。

在此视图中,你可以扁平化类别和子类别,让你可以与几乎没有变化使用当前的代码:

select 
    Name, 
    CategoryName 
from emails 
union 
select 
    Name, 
    CategoryName + '-' + c.SubName 
from emails e 
join classes c on c.id = e.ClassId 

应该返回类似(从给定的样本)

Name CategoryName 
Test1 General 
Test1 Parent 
Test1 Parent-Reception 
Test2 Parent 
Test3 Committee 
Test3 Parent 
Test3 Parent-Year1 

现在,您将代码中对EmailCategory的引用替换为新视图,并且应该完成。