2015-03-12 7 views
0

У меня есть следующий код SQL, который создает очень полезную сводную таблицу:SQL сводной таблица Dynamic - исключить неиспользуемые столбцы

Use [A1_20132014] 

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']') 
       FROM (SELECT DISTINCT Link_ID FROM A1) PV 
       ORDER BY Link_ID 

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       -- We will select the data that has to be shown for pivoting 
       SELECT date_1, StartHour,Cost, Link_ID 
       FROM A1 
       WHERE Section = (''1AB'') 
      ) x 
      PIVOT 
      (
       -- Values in each dynamic column 
       SUM(Cost) 
       -- Select columns from @cols 
       FOR Link_ID IN (' + @cols + ')      
      ) p;' 

EXEC SP_EXECUTESQL @query 

из этих рубрик

 link_id  Section date_1  StartHour Cost data_source 
    4000000027866016A 8NB 2013-09-02 6   5871  1 
    4000000027866017B 5EB 2013-10-09 9   8965  2 
    4000000027856512B 4TB 2013-05-06 15  6754  1 
    4000000027866015A 6HB 2013-06-08 8   5354  1 
    4000000027866011A 1AB 2013-06-09 11   2   1 

с этими типами источников;

link_Id   nvarchar(50)  
    Section   nvarchar(50)  
    Date_1   smalldatetime 
    StartHour  int 
    Cost   float  
    data_source  int 

Однако, несмотря ИНЕК, что указует определенный раздел, к сожалению, все секции еще появляются в сводной таблице, но заполняются NULL значение всего пути вниз.

Есть ли способ полностью исключить столбцы, которые не соответствуют предложению WHERE?

Спасибо за любую помощь.

Henry.

+0

Я думаю, вы должны использовать предложение where в первом запросе, где вы устанавливаете @cols. – KumarHarsh

+0

вы также можете проверить эту ссылку. http://stackoverflow.com/questions/28961753/how-can-i-get-all-items-to-display-as-columns-using-sql-pivot-when-number-of-ite/28962244#28962244 – KumarHarsh

+0

Я не могу заставить это работать, он говорит мне, что раздел является недопустимым именем столбца в части @cols. – hc91

ответ

0

Поместите предложение where в подзапрос. Таким образом, вы получите только столбцы, которые относятся к 1AB

SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']') 
       FROM (SELECT DISTINCT Link_ID FROM A1 WHERE Section = '1AB') PV 
       ORDER BY Link_ID 
+0

Большое спасибо, это абсолютно идеально. Сохраняет длительный и трудоемкий макрос и делает запрос намного быстрее! – hc91

Смежные вопросы