2017-09-28 3 views
1

J'écris une requête sur 3 tables "table1", "table2", "tableMap". en fonction des valeurs sélectionnées dans la liste déroulante. Mais je n'obtiens pas le résultat attendu. S'il vous plaît aider.Requête SQL Server avec plusieurs filtres

Dropdown 1:

<Promo Name> 
- All - value = "" 
- ABC - value = "1" 
- XYZ - value = "2" 

Dropdown 2:

<Store Type> 
- All - value = "" 
- Type 1 - value = "1" 
- Type 2 - value = "2" 

Dropdown 3:

<Store Area> 
- All - value = "" 
- Area 1 - value = "1" 
- Area 2 - value = "2" 

Tableau 1:

ID | Store Name | Store Address | Store Type | Store Area 
---+------------+---------------+------------+----------- 
1 | ABC  | 112 test road| Type 1  | Area 1 
2 | XYZ  | 22 test2 road| Type 2  | Area 2 

Tableau 2:

ID | Promo Name 
---+------------ 
1 | promo 1  
2 | promo 2  

carte de la table:

ID | Promo ID | Store Type | Store Area 
---+------------+----------------+------------+----------- 
1 | 1   | 2,1  | 
2 | 2   |   | 1 

Les valeurs [Type de magasin] et [Zone Store] sont les ID de [Tableau 1] Ainsi, dans la requête ci-dessous, nous doit mapper le [Type de magasin]/[Zone de stockage] avec le [ID] de [Tableau 1]

J'essaie d'écrire une requête afin que je puisse obtenir des résultats en fonction des valeurs sélectionnées de la liste déroulante.

Requête:

declare @promoname varchar(255), 
     @type varchar(255), 
     @area varchar(255) 

select 
    t2.Promo Name, t2.ID, t1.Store Name, t1.Store Address 
from 
    [Tablemap] tm 
inner join 
    [Table2] t2 on tm.Promo ID = t2.ID 
where 
    (@promoname = '' or t2.[promoname] = @promoname) 
    and (@type = '' or @type in (select [name] 
           from dbo.SplitString (tm.Store Type))) 

RÉSULTAT - attendu - (mais ne fonctionne pas avec la requête ci-dessus que je n'ai pas ajouté le tableau de l'emplacement ci-dessus et ne sais pas comment l'ajouter):

Promo Name | Store Name | Address 
-----------+------------+--------------- 
promo 1 | ABC  | 112 test road 
promo 2 | ABC  | 112 test road 
+1

Merci de fournir des exemples bien formatés. Je ne vois pas le tableau 2 dans votre requête. Je vois t2 préfixé pour les valeurs mais je ne le vois pas dans la clause from ou join. –

+1

Quelle est la logique derrière le fait que 'promo 2' soit associé à' ABC' dans vos résultats souhaités? –

+1

Si vous le pouvez, vous devez modifier la nature de 'table map' afin qu'elle ne contienne pas une liste csv des ID de type de magasin. Créez une nouvelle ligne pour chaque fois qu'une promo est associée à une zone ou un type de magasin particulier. Cela rendra votre vie plus facile. – Greenspark

Répondre

1

S'il vous plaît essayez le code ci-dessous.

declare @promoname varchar(255), 
     @type varchar(255), 
     @area varchar(255) 

select t2.Promo Name, t2.ID, t1.Store Name, t1.Store Address 
from 
    [Tablemap] tm 
inner join [Table2] t2 on tm.Promo ID = t2.ID 
inner join [Table1] t1 on tm.Promo ID = t1.ID 
where (@promoname = '' or t2.[promoname] = @promoname) 
    and (@type = '' or t1.[Store Type] in (select [name] from dbo.SplitString (tm.Store Type)))