2015-08-28 2 views
0

я следующие таблицыОпределение Взаимодействия определенных значений в SQL Column

CustomerTable

CustomerID | Year_Date | Score | Tier 
------------------------------------------------------------- 
     100  |  2014  |  50 | Beginner 
     100  |  2014  |  25 | Naieve 
     100  |  2014  |  100 | Pro 
     100  |  2014  |  60 | Mediocre 
     100  |  2014  |  70 | Advanced 
     100  |  2015  |  20 | Poor 
     100  |  2015  |  5 | Unacceptable 
     200  |  2015  |  100 | Pro 
     200  |  2015  |  150 | SuperPro 
     200  |  2015  |  180 | Top 

Взаимодействие Таблица

TierInteraction | AdditionalScore 
---------------------------------- 
Pro_Advanced  |   75 
Beginner_Mediocre |   50 
Pro_SuperPro  |   80 
Pro_Top   |  100 
Mediocre_Poor  |   10 
Poor_Unacceptable |   5 

Теперь из колонки Tier в таблице Customer, мне нужно для определения наличия любого TierInteraction из InteractionTable

Пример - Следующие взаимодействия существуют

Для Клиента 100 за год 2014

  1. Pro_Advanced
  2. Beginner_Mediocre

Для Клиента 100 за год 2015

  1. Poor_Unacceptable

Для Клиента 200 за год 2015

  1. Pro_SuperPro
  2. Top_Pro

И вот как мне нужен результат таблицы

Таблица результатов

CustomerID | Year_Date | Score | Tier  | TierInteraction | AdditionalScore 
-------------------------------------------------------------------------------- 
    100  | 2014  | 50 | Beginner | Beginner_Mediocre | 50 
    100  | 2014  | 25 | Naive  | NULL    |  0 
    100  | 2014  | 100 | Pro   | Pro_Advanced  | 75 
    100  | 2014  | 60 | Mediocre | Beginner_Mediocre | 50 
    100  | 2014  | 70 | Advanced | Pro_Advanced  | 75 
    100  | 2015  | 20 | Poor  | Poor_Unacceptable |  5 
    100  | 2015  | 5 | Unacceptable| Poor_Unacceptable |  5 
    200  | 2015  | 100 | Pro   | Pro_SuperPro  | 80 
    200  | 2015  | 150 | SuperPro | Pro_SuperPro  | 80 
    200  | 2015  | 180 | Top   | Pro_Top   | 100 

Busines ы Правила:

  • взаимодействия должны быть определены для каждого клиента в год
  • Одна строка может иметь несколько взаимодействий с другими строками (клиентами 200 Pro взаимодействует с SuperPro, а также Top) Дополнительная оценка для
    обоих взаимодействий. следует учитывать хотя бы один раз.
  • Порядок взаимодействия не имеет значения. Pro_Advanced такой же, как Advanced_Pro
+0

Это не очень понятно, что вы пытаетесь сделать здесь. Я бы предложил эту ссылку в качестве прекрасного места для начала. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

@SeanLange, на самом деле для меня этот вопрос был хорошо сделан, и я вижу никаких изменений (на данный момент) ... – Shnugo

+0

Хмм ... это не я, который проголосовал за закрытие. Я не смог получить четкую картину, но я рад, что @Shnugo мог. –

ответ

1

Здесь вы:

declare @Customer TABLE(CustomerID INT,Year_Date INT, Score INT, Tier VARCHAR(100)); 
INSERT INTO @customer VALUES 
(100,2014,50,'Beginner') 
,(100,2014,25,'Naieve') 
,(100,2014,100,'Pro') 
,(100,2014,60,'Mediocre') 
,(100,2014,70,'Advanced') 
,(100,2015,20,'Poor') 
,(100,2015,5,'Unacceptable') 
,(200,2015,100,'Pro') 
,(200,2015,150,'SuperPro') 
,(200,2015,180,'Top'); 

declare @TierInteraction TABLE(TierInteraction VARCHAR(100),AdditionalScore INT); 
insert into @TierInteraction VALUES 
('Pro_Advanced',75) 
,('Beginner_Mediocre',50) 
,('Pro_SuperPro',80) 
,('Pro_Top',100) 
,('Mediocre_Poor',10) 
,('Poor_Unacceptable',5); 

WITH TierInteractionResolved AS 
(
    SELECT ti.* 
      ,tiParts.* 
    FROM @TierInterAction AS ti 
    CROSS APPLY(SELECT CAST('<root><r>' + REPLACE(ti.TierInteraction,'_','</r><r>') + '</r></root>' AS XML)) AS tiSplit(ti) 
    CROSS APPLY 
    (
     SELECT tiSplit.ti.value('/root[1]/r[1]','varchar(max)') AS firstPart 
       ,tiSplit.ti.value('/root[1]/r[2]','varchar(max)') AS secondPart 
    ) AS tiParts 
) 
SELECT * 
FROM @Customer AS c 
CROSS APPLY 
(
    SELECT * 
    FROM TierInteractionResolved AS tir 
    WHERE (c.Tier=tir.firstPart AND EXISTS(SELECT x.* FROM @customer AS x WHERE tir.secondPart=x.Tier AND x.Year_Date=c.Year_Date)) 
     OR (c.Tier=tir.secondPart AND EXISTS(SELECT x.* FROM @customer AS x WHERE tir.firstPart=x.Tier AND x.Year_Date=c.Year_Date)) 

) AS FinalTiers 
ORDER BY c.CustomerID,c.Year_Date 
+0

@ Ашай Ниргуде, это решение для вас? Если да, пожалуйста, проголосуйте и отметьте как принято, thx – Shnugo

+0

Я попробовал ваш запрос, но всегда возвращал ошибку исключения из памяти. Реальная задача, с которой я столкнулся, заключается в добавлении дополнительных оценок в новый столбец, когда определенные значения существуют в определенном столбце. Могу ли я полностью удалить таблицу взаимодействия и написать запрос с помощью case case? Пример. Если у идентификатора клиента есть Pro и Advanced Tier в течение года, дополнительный балл должен быть равен 75. –

+0

@AshayNirgude, я не могу вообразить, что эти строки производят какие-то исключения из памяти ... Если вы берете мои строки кода и мимо них в пустое окно запроса, вы должны увидеть ожидаемый результат ... – Shnugo

Смежные вопросы