2016-12-14 5 views
0

Ich möchte Zeilen in meiner gespeicherten Prozedur filtern, wenn ich also nach einem Kanal suche, erhalte ich nur den Kanalwert, den ich in einem Parameterfeld angegeben habe. HierFilter Zeilen in der gespeicherten Prozedur SQL Server

ist der Code:

CREATE TABLE iGuide 
    ([Zone] varchar(3), [Enabled] int, [Channel] varchar(4), [DMA] varchar(7), [Region] varchar(7), [HQ] varchar(10), [Machine] varchar(10)) 
; 

INSERT INTO iGuide 
    ([Zone], [Enabled], [Channel], [DMA], [Region], [HQ], [Machine]) 
VALUES 
    ('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') 
; 

GO 

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

AS 

    DECLARE @columns NVARCHAR(MAX)  
      ,@sql NVARCHAR(MAX) 
      ,@zone 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 (HQ LIKE @Filter) OR (Region LIKE @Filter) 
     ) AS T 

    select @columns; 

    SET @zone = N'' 
    --Get column names for entire pivoting 
    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 

    select @zone;  

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


    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'AEN';  

Ergebnis dieses Code:

Channel ACC ANJ CHI 
1 AEN  1 1 1 
2 CNN  1 1 1 
3 ESPN  1 1 1 
4 FOOD  1 0 1 
5 HIST  1 1 0 

Mein gewünschtes Ergebnis, wenn 'AEN' Ausführen als ein Wert sein sollte:

Channel ACC ANJ CHI 
1 AEN  1 1 1 

Antwort

1

Added Eine Where-Klausel für Ihren Pivot.

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

AS 

    DECLARE @columns NVARCHAR(MAX)  
      ,@sql NVARCHAR(MAX) 
      ,@zone 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 (HQ LIKE @Filter) OR (Region LIKE @Filter) 
     ) AS T 

    select @columns; 

    SET @zone = N'' 
    --Get column names for entire pivoting 
    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 

    select @zone;  

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


    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 
    WHERE channel = ''' + @filter + ''' ORDER BY Channel 
    ' 
    select @sql; 
    EXEC sp_executesql @sql; 

GO 
EXECUTE [dbo].Usp_GetWHERE N'AEN'; 
+0

Die einzige Frage, die ich habe ich jetzt eine Möglichkeit, Wildcards mit meiner Suche hinzuzufügen? Ich habe "=" mit "LIKE" -Operator ersetzt, aber wenn Sie AE% eingeben, wird meine Tabelle nicht gefüllt, aber der reguläre AEN-Name wird ausgefüllt –

+0

Ich kann meine Tabelle jetzt nicht nach anderen Kriterien als einem Kanal filtern . –

0

Alles, was Sie tun müssen, ist es in die Sie erhalten 5 Ergebnisse WHERE

SET @sql = N' 
SELECT [Channel], ' + STUFF(@columns, 1, 2, '') + ' 
FROM (SELECT Channel, [Zone] 
     FROM iGuide 
     WHERE [Zone] IN ' + @zone + ' AND [Channel] = @Your_Param_Here) as source 
1

hinzufügen, da @filter könnte mit DMA oder Channel oder Zone oder Machine oder HQ oder Region passend werden.

Wenn Sie wollen, dann streng auf der Grundlage von Kanal filtern, entweder ändern @zone zu

SELECT @zone += N', ' + QUOTENAME(Zone, '''') 
     FROM (select distinct Zone 
      from iGuide WHERE Channel = @Filter 
     ) AS T 

oder es in der Hauptabfrage filtern, indem eine Bedingung hinzugefügt für [email protected]

SET @sql = N' 
SELECT [Channel], ' + STUFF(@columns, 1, 2, '') + ' 
FROM (SELECT Channel, [Zone] 
     FROM iGuide 
     WHERE [Zone] IN ' + @zone + ' AND (([Channel] LIKE ''' + @Filter +''') OR ([Zone] LIKE ''' + @Filter +''') OR ([DMA] LIKE ''' + @Filter +''') OR ([HQ] LIKE ''' + @Filter +''') OR ([Machine] LIKE ''' + @Filter +''') OR ([Region] LIKE ''' + @Filter +'''))) as source 
    PIVOT 
    (
     count([Zone]) FOR [Zone] IN (' 
     + STUFF(REPLACE(@columns, ', [', ',['), 1, 1, '') 
     + ') 
    ) AS Pivot1 ORDER BY Channel 
    ' 
Verwandte Themen