2016-03-01 37 views
1

我有3張桌子我正在這裏工作。 ATTRIBUTE_MAPGROUP_DEFINITIONSGROUP_MAP合併的地方存在的定義

ATTRIBUTE_MAP包含CUST_ID和相關的ATTRIBUTE_ID

GROUP_DEFINITIONS定義了一個組。它的列是GROUP_ID,ATTRIBUTE_1,VALUE_1,ATTRIBUTE_2,VALUE_2,ATTRIBUTE_3,VALUE_3一個組由1到3個具有值的屬性組成。例如,一個屬性可以是「狀態」,其值爲「紐約」。對於像「擁有汽車」這樣的布爾值,值也可以爲null。

GROUP_MAP只是將CUST_ID映射到GROUP_ID

現在,我正在嘗試編寫一個腳本,查看ATTRIBUTE_MAP並查看客戶是否屬於GROUP_DEFINITIONS中定義的組中的一個。如果他(客戶)這樣做,則插入/更新一行到GROUP_MAPCUST_IDGROUP_ID。我遇到問題的部分是匹配屬性值。

這是我到目前爲止有:

merge GROUP_MAP gm using 
(select am.CUST_ID 
     ,am.ATTRIBUTE_ID 
     ,am.START_DATE 
     ,gd.GROUP_ID 
     ,gd.ATTRIBUTE_1 
     ,gd.VALUE_1 
     ,gd.ATTRIBUTE_2 
     ,gd.VALUE_2 
     ,gd.ATTRIBUTE_3 
     ,gd.VALUE_3 
from ATTRIBUTE_MAP am, GROUP_DEFINITIONS gd) src 
on gm.GROUP_ID=src.GROUP_ID 
    AND gm.CUST_ID=src.CUST_ID 

when not matched then -- create association in GROUP_MAP 
insert (CUST_ID, GROUP_ID, FROM_DATE) 
values (src.CUST_ID, src.GROUP_ID, src.START_DATE); 

上午我正確地處理這個?我猜我需要改進我的合併嵌套選擇語句加入ATTRIBUTE_MAPPEER_GROUP_DEFINTIONS,然後從那裏去。任何幫助/建議,將不勝感激。

下面是參考一個示例:

ATTRIBUTE_MAP

+---------+--------------+------------+ | CUST_ID | ATTRIBUTE_ID | VALUE | +---------+--------------+------------+ | 50 | 1 | 'New York' | +---------+--------------+------------+ | 50 | 2 | | +---------+--------------+------------+

GROUP_DEFINITIONS

+----------+-------------+------------+-------------+---------+-------------+---------+ | GROUP_ID | ATTRIBUTE_1 | VALUE_1 | ATTRIBUTE_2 | VALUE_2 | ATTRIBUTE_3 | VALUE_3 | +----------+-------------+------------+-------------+---------+-------------+---------+ | 10 | 1 | 'New York' | 2 | | | | +----------+-------------+------------+-------------+---------+-------------+---------+ | 20 | 2 | | | | | | +----------+-------------+------------+-------------+---------+-------------+---------+

等腳本應該生成(在GROUP_MAP):

+---------+----------+--------+ | CUST_ID | GROUP_ID | DATE | +---------+----------+--------+ | 50 | 10 | *date* | +---------+----------+--------+ | 50 | 20 | *date* | +---------+----------+--------+

+0

你能不能解釋一下什麼是ATTRIBUTE_MAP和GROUP_DEFINITIONS –

+0

@KamranFarzami有關係還真是兩者之間沒有直接關係。 ATTRIBUTE_MAP將離散屬性/值映射到客戶,而GROUP_DEFINTIONS更像一個維度表 - 它只是用來定義一個組。那有意義嗎? – Ted

+0

ATTRIBUTE_MAP記錄是否必須匹配GROUP_DEFINITIONS記錄中的所有屬性,或者只匹配其中的任何一個屬性?是空的GROUP_DEFINITIONS.ATTRIBUTE_ [X]值NULL還是空字符串? – radshop

回答

1

我完全可以關閉,但它看起來像你的內部選擇需要是這樣的。如果我明白你想要做什麼,這將返回一個CUST_ID,GROUP_ID,START_DATE的唯一列表,其中所有客戶屬性都與所有組屬性匹配。只是寫得很快,所以可能會有一些錯誤,但它可能會讓你朝正確的方向發展。

with gd as (
    SELECT GROUP_ID, ATTRIBUTE_1 as ATTRIBUTE_ID, VALUE_1 as VALUE from GROUP_DEFINITIONS 
    UNION 
    SELECT GROUP_ID, ATTRIBUTE_2, VALUE_2 from GROUP_DEFINITIONS 
    UNION 
    SELECT GROUP_ID, ATTRIBUTE_3, VALUE_3 from GROUP_DEFINITIONS 
) 
MERGE GROUP_MAP gm 
USING 
    (
    SELECT am.CUST_ID, gd.GROUP_ID, am.START_DATE 
    FROM ATTRIBUTE_MAP am 
    JOIN gd 
    ON am.ATTRIBUTE_ID = gd.ATTRIBUTE_ID AND coalesce(am.VALUE, '') = coalesce(gd.VALUE, '') 
    join (select GROUP_ID, count(*) as ATTR_COUNT from gd where ATTRIBUTE_ID is NOT NULL group by GROUP_ID) as gc 
    on gd.GROUP_ID = gc.GROUP_ID 
    GROUP BY am.CUST_ID, gd.GROUP_ID, am.START_DATE 
    HAVING count(am.ATTRIBUTE_ID) = max(gc.ATTR_COUNT) 
    ) src 
    ON gm.GROUP_ID = src.GROUP_ID 
     AND gm.CUST_ID = src.CUST_ID 
    WHEN NOT MATCHED 
    THEN -- create association in GROUP_MAP 
    INSERT(CUST_ID, 
      GROUP_ID, 
      FROM_DATE) VALUES 
         (src.CUST_ID, src.GROUP_ID, src.START_DATE); 
+0

我只是使用@KamranFarzami的設置代碼來測試它,並且它不會沒有工作(急於開始),我現在沒有時間去處理它。我會稍後再回來看看。 – radshop

+0

修復並測試了代碼。我認爲它符合你的要求。 – radshop

+0

這看起來像它迄今爲止的工作。我對語法有點困惑。爲什麼我們需要在這裏合併:'coalesce(am.VALUE,'')= coalesce(gd.VALUE,'')'? – Ted

1

如果我的理解這個問題正確這應該這樣做:

請注意我用GETDATE()因爲我沒有現場[START_DATE],但你需要在代碼中替代這次

示例數據:

CREATE TABLE #ATTRIBUTE_MAP(CUST_ID  INT, 
         ATTRIBUTE_ID INT, 
         VALUE  VARCHAR(20)); 

INSERT INTO #ATTRIBUTE_MAP 
VALUES 
     (50, 1, 'New York'), 
     (50, 2, NULL); 

CREATE TABLE #GROUP_DEFINITIONS(GROUP_ID INT, 
          ATTRIBUTE_1 INT, 
          VALUE_1  VARCHAR(20), 
          ATTRIBUTE_2 INT, 
          VALUE_2  VARCHAR(20), 
          ATTRIBUTE_3 INT, 
          VALUE_3  VARCHAR(20)); 

INSERT INTO #GROUP_DEFINITIONS 
VALUES 
     (10, 1, 'New York', 2, NULL, NULL, NULL), 
     (20, 2, NULL, NULL, NULL, NULL, NULL); 

CREATE TABLE #GROUP_MAP(CUST_ID  INT, 
        GROUP_ID INT, 
        [FROM_DATE] DATE); 

QUERY:

MERGE #GROUP_MAP gm 
USING 
    (SELECT DISTINCT 
      am.CUST_ID, 
      CAST(GETDATE() AS DATE) AS [START_DATE], --<-- you will need to change this 
      gd.GROUP_ID 
    FROM #ATTRIBUTE_MAP am 
      INNER JOIN 
        (
        SELECT GROUP_ID, 
         ATTRIBUTE_1 AS ATTRIBUTE_ID, 
         VALUE_1 
        FROM  #GROUP_DEFINITIONS 
        UNION ALL 
        SELECT GROUP_ID, 
         ATTRIBUTE_2, 
         VALUE_2 
        FROM  #GROUP_DEFINITIONS 
        UNION ALL 
        SELECT GROUP_ID, 
         ATTRIBUTE_3, 
         VALUE_3 
        FROM #GROUP_DEFINITIONS) gd ON am.ATTRIBUTE_ID = gd.ATTRIBUTE_ID) src 
    ON gm.GROUP_ID = src.GROUP_ID 
     AND gm.CUST_ID = src.CUST_ID 
    WHEN NOT MATCHED 
    THEN -- create association in GROUP_MAP 
    INSERT(CUST_ID, 
      GROUP_ID, 
      FROM_DATE) VALUES 
         (src.CUST_ID, src.GROUP_ID, src.START_DATE); 

校驗結果:

SELECT CUST_ID , GROUP_ID , FROM_DATE 
FROM #GROUP_MAP; 

結果:

enter image description here

+2

我可能是錯的,但對我來說,如果某些屬性(而不是所有屬性)匹配,它看起來會錯誤地匹配客戶和組。您的示例數據沒有這種情況。 – radshop

+0

@radshop請你完成下面和評論回給我,我會測試你說話的情景: INSERT INTO #GROUP_DEFINITIONS VALUES \t( ) –

+0

INSERT INTO #GROUP_DEFINITIONS VALUES(30,1,'New York',5,'Bakery',NULL,NULL) – radshop