2015-08-04 4 views
0

я в настоящее время есть таблица SQL, который выглядит примерно так:Создать новое измерение, используя значения из другого измерения в SQL?

RuleName  | RuleGroup 
--------------------------- 
Backdated task | DRFHA 
Incorrect Num | FRCLSR 
Incomplete close | CFPBDO 
Appeal close  | CFPBDO 
Needs letter  | CFPBCRE 
Plan ND   | DO 
B7IND   | CORE 

В настоящее время я пишу хранимую процедуру в SSMS, которая тянет эти размеры из существующей таблицы. Тем не менее, я также хочу, чтобы процедура создала новое измерение, которое создаст измерение «SuperGroup» для каждого правила на основе текста в его RuleGroup (и другого столбца для остальных). Например:

RuleName  | RuleGroup | SuperGroup 
-------------------------------------------- 
Backdated task | DRFHA  | Other 
Incorrect Num | FRCLSR | Fore 
Incomplete close | CFPBDO | DefaultOp 
Appeal close  | CFPBDO | DefaultOp 
Needs letter  | CFPBCRE | Core 
Plan ND   | DO  | DefaultOp 
B7IND   | CORE  | Core 

я в настоящее время пытался использовал «GROUP BY» функции, а также с помощью SELECT, с несколькими «LIKE» заявления. Однако проблема заключается в том, что это должно быть масштабируемо - хотя сейчас у меня есть только 21 группа, я хочу автоматически сортировать, добавляя новые группы.

Вот процедура SSMS, а также:

CREATE PROCEDURE [Rules].[PullRulesSpecifics] 
AS 
BEGIN 
SELECT 
    ru.RuleName 
    ru.RuleGroup 
FROM RuleData.groupings ru 
WHERE 1=1 
AND ru.ActiveRule = 1 
AND ru.RuleOpen >= '2015-01-01' 
+0

ssms - это интерфейс управления, который, как оказалось, способен запускать sql. нет такой вещи, как «процедура ssms». в mssql хранятся процедуры, с которыми вы можете управлять с помощью ssms. –

+0

Как вы, «SELECT с несколькими« LIKE »утверждениями»? Это важно, потому что вы хотите, чтобы ваше решение было масштабируемым, а не жестко запрограммированным для ваших текущих 21 группы. – DeadZone

+0

Точно - я не смог найти, чтобы сделать это масштабируемым, используя этот метод. Я пытаюсь найти способ сделать процедуру автоматически сортировать RuleGroup (включая любые новые) при каждом запуске. –

ответ

0

Вариант 1: (нормализованна вариант) Предполагая, что база данных хорошо нормализуется, вы должны иметь внешний ключ на столбце RuleGroup, что предотвращает пользователям вводить все, что им нравится. Таким образом, в таблицу могут быть введены только действительные значения RuleGroup. Если это тот случай (я подозреваю, что это не так), вы можете добавить столбец в таблицу внешнего ключа (тот, который содержит список допустимых значений RuleGroup), который указывает, к какой группе SuperGroup принадлежит RuleGroup. (В столбце SuperGroup в идеале есть ограничение FK на нем, а также ссылка на другую таблицу, содержащую все допустимые значения SuperGroup.) Если вы используете этот подход, тогда всякий раз, когда добавляется новая SuperGroup, кодирование не кодируется. Он поддерживает себя.

Вариант 2: (не лучшая практика, попробуйте вариант # 1, если вы можете) Создать новую таблицу супергруппы с 2-мя колонками: SuperGroup и MatchingCriteria. Затем вы можете присоединиться к новой таблице SuperGroups. (Обратите внимание, что это предполагает, что каждый MatchingCriteria будет взаимоисключающим. Если нет, то вы можете сопоставить более 1 SuperGroup и получить результаты, которые вы, возможно, не планировали. Либо это, либо вам придется найти другой способ ограничить результаты . к одному супергруппы) запрос будет выглядеть следующим образом:

SELECT 
    ru.RuleName, 
    ru.RuleGroup, 
    sg.SuperGroup 
FROM RuleData.groupings ru 
JOIN RuleData.SuperGroups sg ON ru.RuleGroup LIKE sg.MatchingCriteria 
WHERE ru.ActiveRule = 1 
AND ru.RuleOpen >= '2015-01-01' 

Я удалил WHERE 1 = 1 код. Это было необязательно и, вероятно, именно там, чтобы помочь вам отладить вашу проблему.

+0

. Моя проблема такова: для чего-то вроде «CFPB CORE», я хочу отфильтровать его в группу CFPB, но не Ядро группы. –

+0

SOLVED спасибо! Я закончил тем, что создал таблицу, которая сейчас просто помещает что-нибудь еще в другое. –

+0

@RishiMehta Я рад помочь.Если это помогло решить вашу проблему, отметьте ее как принятый ответ. – DeadZone

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