2016-10-04 9 views
0

現在、私は電子メールカテゴリのリストを持っています。私は人とそのカテゴリを選択しました。サブカテゴリを持つカテゴリの動的ピボット

これで、各電子メールカテゴリに、そのカテゴリ内のタイプにリンクするIDが割り当てられる可能性があるという要件が追加されました。

たとえば、Parentという電子メールカテゴリは、クラステーブルにリンクされた特定のクラス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 

を次のように

私の表は、私がリンクされたクラスのない単なるカテゴリでそれを取得するには、次のSQLを使用しています

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 

をされてほしい何に似ています。

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にしますか? –

+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への参照をその新しいビューに置き換えたら、完了してください。

関連する問題