2017-10-14 2 views
0

J'ai un tableau des enregistrements démographiques dans la base de données.Application de filtres tabulés indéterminés à une table

| biDemographicId | biPostId | vcDemographicType | vcDemographicValue | 
|-----------------|----------|-------------------|--------------------| 
|    1 |  1 | country   | CA     | 
|    2 |  1 | language   | FR     | 
|    3 |  1 | platform   | IOS    | 
|    4 |  2 | country   | US     | 
|    5 |  2 | language   | EN     | 
|    6 |  2 | platform   | IOS    | 
|    7 |  3 | country   | US     | 
|    8 |  3 | language   | ES     | 
|    9 |  3 | platform   | WEB    | 

que je veux les seuls où les enregistrements:

  • Pays est CA ou US
  • Langue est FR.
  • La plate-forme est IOS.

Ces filtres sont passés en format XML, puis sous forme de tableaux:

<Demographics> 
    <Demographic type="country">US</Demographic> 
    <Demographic type="country">CA</Demographic> 
    <Demographic type="lang">FR</Demographic> 
    <Demographic type="platform">IOS</Demographic> 
</Demographics> 

| vcFilterType | vcFilterValue | 
|--------------|---------------| 
| language  | FR   | 
| country  | CA   | 
| country  | US   | 
| platform  | IOS   | 

Mon résultat souhaité serait la suivante:

| biDemographicId | biPostId | vcDemographicType | vcDemographicValue | 
|-----------------|----------|-------------------|--------------------| 
|    1 |  1 | country   | CA     | 
|    2 |  1 | language   | FR     | 
|    3 |  1 | platform   | IOS    | 

Ou plus généralement:

{ 
    { posts | type=type1 & value=value1,1 } 
    ∪ ... 
    ∪ { posts | type=type1 & value=value1,N } 
} 
∩ 
... 
∩ 
{ 
    { posts | type=typeM & value=valueN,1 } 
    ∪ ... 
    ∪ { posts | type=typeM & value=valueM,N } 
} 

Avec une table de filtre:

| vcFilterType | vcFilterValue | 
|--------------|---------------| 
| type1  | value1,1  | 
| ...   | ...   | 
| type1  | value1,N  | 
| ...   | ...   | 
| typeM  | valueM,1  | 
| ...   | ...   | 
| typeM  | valueM,N  | 

Mon problème est que les types et les valeurs sont des variables, donc je ne peux pas simplement faire WHERE type = 'country' AND value = 'CA'.

+2

Construire une requête dynamique dans la langue que vous utilisez le développement. –

+0

Ces filtres sont passés dans quoi? –

Répondre

1

Disons que nous avons la table de données et la table de filtrage déjà défini:

DECLARE @DataSource TABLE 
(
    [biDemographicId] INT 
    ,[biPostId] INT 
    ,[vcDemographicType] VARCHAR(12) 
    ,[vcDemographicValue] VARCHAR(3) 
); 

INSERT INTO @DataSource ([biDemographicId], [biPostId], [vcDemographicType], [vcDemographicValue]) 
VALUES (1, 1, 'country', 'CA') 
     ,(2, 1, 'language', 'FR') 
     ,(3, 1, 'platform', 'IOS') 
     ,(4, 2, 'country', 'US') 
     ,(5, 2, 'language', 'EN') 
     ,(6, 2, 'platform', 'IOS') 
     ,(7, 3, 'country', 'US') 
     ,(8, 3, 'language', 'ES') 
     ,(9, 3, 'platform', 'WEB'); 

DECLARE @FilterDataSource TABLE 
(
    [vcFilterType] VARCHAR(12) 
    ,[vcFilterValue] VARCHAR(3) 
); 

INSERT INTO @FilterDataSource ([vcFilterType], [vcFilterValue]) 
VALUES ('language', 'FR') 
     ,('country', 'CA') 
     ,('country', 'US') 
     ,('platform', 'IOS'); 

Ce que nous pouvons faire est de compter les DISTINCT types de filtrage - pour, par exemple dans votre cas, nous avons 3 types de filtrage distincts - language, country et platform.

Nous devons obtenir que ces documents, qui sont correspondant aux valeurs de ces trois types:

DECLARE @DistinctFilteringCriteria TINYINT; 

SELECT @DistinctFilteringCriteria = COUNT(DISTINCT [vcFilterType]) 
FROM @FilterDataSource; 

WITH DataSource AS 
(
    SELECT DS.* 
      ,COUNT([vcDemographicType]) OVER (PARTITION BY [biPostId]) AS [FilteringCriteriaMatched] 
    FROM @DataSource DS 
    INNER JOIN @FilterDataSource FDS 
     ON DS.[vcDemographicType] = FDS.[vcFilterType] 
     AND DS.[vcDemographicValue] = FDS.[vcFilterValue] 
) 
SELECT [biDemographicId], [biPostId], [vcDemographicType], [vcDemographicValue] 
FROM DataSource 
WHERE [FilteringCriteriaMatched] = @DistinctFilteringCriteria; 

Ca y est:

enter image description here

+0

J'aime ça! Approche intelligente! – Shnugo