2016-11-29 3 views
2

Я могу фильтровать столбцы, но не строки.Есть ли способ фильтровать строки в динамической хранимой процедуре?

Вот мои данные iGuide Таблица Я использую с моим PIVOT:


///////////////////////////////////////////////////// 

Zone Enabled  Channel DMA Region HQ  Machine 
ACC   1  AEN Norfolk Other virginia dzsfk 
ACC   1  CNN Norfolk Other virginia dzsfk 
ACC   1  ESPN Norfolk Other virginia dzsfk 
ACC   1  HIST Norfolk Other virginia dzsfk 
ACC   1  FOOD Norfolk Other virginia dzsfk 
ANJ   1  AEN Paducah Pacific hqs3ftbgwi adanj 
ANJ   1  ESPN Paducah Pacific hqs3ftbgwi adanj 
ANJ   1  HIST Paducah Pacific hqs3ftbgwi adanj 
ANJ   1  CNN Paducah Pacific hqs3ftbgwi adanj 
CHD   1  ESPN Denver Pacific hqs3ftbgwi adchd 
CHD   1  FOOD Denver Pacific hqs3ftbgwi adchd 
CHD   1  DISC Denver Pacific hqs3ftbgwi adchd 
CHI   1  AEN Denver Pacific hqs3ftbgwi adchd 
CHI   1  FOOD Chico Pacific hqs4ftbgwi adv1chicca 
CHI   1  ESPN Chico Pacific hqs4ftbgwi adv1chicca 
CHI   1  CNN Chico Pacific hqs4ftbgwi adv1chicca 

///////////////////////////////////////////////////// 

Here is an example of my initial result of Stored Procedure without any filters: 

CHANNEL | ACC | ANJ | CHD | CHI | 
AEN  1  1 NULL 1 
CNN  1  1 NULL 1 
ESPN  1  1  1  1 
FOOD  1 NULL 1  1 
HIST  1  1 NULL NULL 
DISC  NULL NULL 1 NULL 
_________________________________________________ 

Вот мой текущий результат я получаю после применения зоны @Filter = 'АСС':

_________________________________________________ 
CHANNEL | ACC | 
AEN  1 
CNN  1 
ESPN  1 
FOOD  1 
HIST  1 
DISC  NULL 
_________________________________________________ 

Мой желаемый результат - это:

_________________________________________________ 
CHANNEL | ACC | 
AEN  1 
CNN  1 
ESPN  1 
FOOD  1 
HIST  1 
_________________________________________________ 

Как избавиться от пустых строк NULL при применении фильтра?

Вот мой код:

USE [Media_Ops] 
    GO 

    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER Procedure [dbo].[Usp_GetWHERE] 
    @Filter Varchar(MAX) 

    AS 

    DECLARE @columns NVARCHAR(MAX)  
      ,@sql NVARCHAR(MAX) 

    SET @columns = N'' 
    --Get column names for entire pivoting 
    SELECT @columns += N', ' + QUOTENAME(Zone) 
     FROM (select distinct Zone 
      from iGuide WHERE (DMA LIKE @Filter) OR (Channel = @Filter) OR (@Filter = ' Select All') OR (@Filter = 'Select All') OR (Zone LIKE @Filter) OR (Machine LIKE @Filter) OR (Company LIKE @Filter) OR (HQ LIKE @Filter) OR (Region LIKE @Filter) 
     ) AS T 
    --select @columns 
    SET @sql = N' 
    SELECT Distinct Channel, ' + STUFF(@columns, 1, 2, '') + ' 
    FROM iGuide 
    PIVOT 
    (
     count(Zone) FOR Zone IN (' 
     + STUFF(REPLACE(@columns, ', [', ',['), 1, 1, '') 
     + ') 
    ) AS Pivot1 ORDER BY Channel 
    ' 
    PRINT @sql; 
    EXEC sp_executesql @sql; 
+1

Каков ваш текущий результат с этим запросом? \t Пожалуйста, прочитайте [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t И вот отличное место для [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/), чтобы узнать, как улучшить качество вопроса и получить лучшие ответы. \t [** Как создать минимальный, полный и проверяемый пример **] (http://stackoverflow.com/help/mcve) –

+0

Я получаю вывод всего в столбце ACC. Я не хочу видеть строки с NULL. _____________ –

+0

И каковы ваши исходные данные? Мне кажется, что вы должны фильтровать перед отправкой на pivot –

ответ

1

SQL DEMO Создать новую переменную @zone для фильтрации перед тем стержнем

CREATE Procedure [dbo].[Usp_GetWHERE] 
    @Filter Varchar(MAX) 

AS 

    DECLARE @columns NVARCHAR(MAX)  
      ,@sql NVARCHAR(MAX) 
      ,@zone NVARCHAR(MAX) 

    --Get column names for entire pivoting 
    SET @columns = N'' 
    SELECT @columns += N', ' + QUOTENAME(Zone) 
     FROM (select distinct Zone 
      from iGuide WHERE (DMA LIKE @Filter) OR (Channel = @Filter) OR (@Filter = ' Select All') OR (@Filter = 'Select All') OR (Zone LIKE @Filter) OR (Machine LIKE @Filter) OR (HQ LIKE @Filter) OR (Region LIKE @Filter) 
     ) AS T 

    --Get column names for filter source  
    SET @zone = N'' 
    SELECT @zone += N', ' + QUOTENAME(Zone, '''') 
     FROM (select distinct Zone 
      from iGuide WHERE (DMA LIKE @Filter) OR (Channel = @Filter) OR (@Filter = ' Select All') OR (@Filter = 'Select All') OR (Zone LIKE @Filter) OR (Machine LIKE @Filter) OR (HQ LIKE @Filter) OR (Region LIKE @Filter) 
     ) AS T 

    SET @zone = '(' + substring(@zone, 3, len(@zone)-2) + ')';   

    SET @sql = N' 
    SELECT [Channel], ' + STUFF(@columns, 1, 2, '') + ' 
    FROM (SELECT Channel, [Zone] 
      FROM iGuide 
      WHERE [Zone] IN ' + @zone + ') as source 
    PIVOT 
    (
     count([Zone]) FOR [Zone] IN (' 
     + STUFF(REPLACE(@columns, ', [', ',['), 1, 1, '') 
     + ') 
    ) AS Pivot1 ORDER BY Channel 
    ' 
    select @sql; 
    EXEC sp_executesql @sql; 

GO 
EXECUTE [dbo].Usp_GetWHERE N'ACC';    

ВЫВОД

enter image description here

+0

Хуан, это сработало отлично! Однако, когда я пытаюсь применить остальные фильтры, я получаю сообщение об ошибке: Недопустимый параметр длины передается функции LEFT или SUBSTRING. –

+0

Я пытался ввести «Норфолк» и получил это сообщение об ошибке –

+0

well 'Norfolk'' 'DMA' не' [Zone] 'Вам нужно развернуть случаи. –

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