2016-10-04 51 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的引用替換爲新視圖,並且應該完成。