使用SQL中其他维度的值创建新维度?

时间:2015-08-04 14:33:00

标签: sql sql-server stored-procedures grouping

我目前有一个类似于这样的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'

1 个答案:

答案 0 :(得分:0)

选项1 :(规范化选项) 假设您的数据库已正确规范化,您的RuleGroup列上应该有一个Foreign-Key约束,阻止用户在那里输入他们喜欢的内容。这样,只能将有效的RuleGroup值输入到表中。如果是这种情况(我怀疑它不是这种情况),那么您可以向外键表(保存有效RuleGroup值列表的表)添加一列,指示RuleGroup属于哪个SuperGroup。 (SuperGroup列理想情况下也会对其有一个FK约束,它引用包含所有有效SuperGroup值的另一个表。)如果使用这种方法,那么每当添加新的SuperGroup时都不会涉及编码。它维持着自己。

选项2 :(不是最佳做法,如果可以,请尝试选项#1) 创建一个包含2列的新SuperGroups表:SuperGroupMatchingCriteria。然后,您可以加入新的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代码。这是不必要的,可能只是帮助您调试问题。