我目前有一个类似于这样的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"每个规则的维度基于其中的文本规则组(以及其余的其他列)。例如:
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 :(得分:0)
选项1 :(规范化选项) 假设您的数据库已正确规范化,您的RuleGroup列上应该有一个Foreign-Key约束,阻止用户在那里输入他们喜欢的内容。这样,只能将有效的RuleGroup值输入到表中。如果是这种情况(我怀疑它不是这种情况),那么您可以向外键表(保存有效RuleGroup值列表的表)添加一列,指示RuleGroup属于哪个SuperGroup。 (SuperGroup列理想情况下也会对其有一个FK约束,它引用包含所有有效SuperGroup值的另一个表。)如果使用这种方法,那么每当添加新的SuperGroup时都不会涉及编码。它维持着自己。
选项2 :(不是最佳做法,如果可以,请尝试选项#1)
创建一个包含2列的新SuperGroups表: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代码。这是不必要的,可能只是帮助您调试问题。