2017-10-14 17 views
0

データベースに人口統計レコードのテーブルがあります。言語はFRであるテーブルに不定の表形式のフィルタを適用します。

    • 国CA またはである米国
    • | 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    | 
      

      は、私はレコードのみ欲しいと言います。

    • プラットフォームはIOSです。

    これらのフィルタは、XMLとして渡された後、集計されています

    <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   | 
    

    私の望ましい結果は以下のようになります。一般的に

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

    以上:

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

    フィルタテーブルの場合:

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

    私の問題は、タイプと値が変数であるため、WHERE type = 'country' AND value = 'CA'を実行できないということです。

  • +2

    は、使用するどのような開発言語で、動的クエリを作成します。 –

    +0

    これらのフィルタは何に渡されますか? –

    答えて

    1

    のは、我々は、データテーブルと、すでに定義されたフィルタリングテーブルを持っているとしましょう: - 例えば、あなたのケースでは、我々は3個別のフィルタリングの種類を持っている

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

    私たちにできることは何DISTINCTフィルタリングの種類を数えることです -

    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; 
    
    01: languagecountryplatform.

    我々は、これら3種類の値に一致しているだけでこれらのレコードを取得する必要がありますそれだ

    enter image description here

    +0

    よかった!巧みなアプローチ! – Shnugo

    関連する問題