SQL使用预定义规则提供数据

时间:2016-11-02 09:34:47

标签: sql sql-server

我正在寻找一种优雅的方式,提供数据,以及有关内容的规则。

让我们假设以下内容: 我想计算客户的折扣。我有客户类别,“HappyHours”和折扣。

我有9个不同的类别,每个类别有3个不同的欢乐时光时间。折扣取决于类别和时间的组合。这些值不会经常变化,所以我正在寻找一种解决这个问题的“常量”方法。

示例:

  1. categoryPremium&& timeOne等于20%的折扣
  2. categoryPremium&& timeTwo等于22%的折扣
  3. categoryPremium&& timeThree等于30%的折扣
  4. categoryRegular&& timeOne等于10%的折扣
  5. categoryRegular&& timeTwo等于15%的折扣
  6. 依旧......

    这适用于某个应用程序,每次执行都需要折扣。所以找到一种干净而快速的方法真的很不错。

    我想到了两种可能性:

    1. 一个表,其中复合主键(category和happyHour)手动填充
    2. 硬编码分配函数(类似于the number of matches between two rows mysql
    3. 你怎么看?有没有更有活力的方式?

2 个答案:

答案 0 :(得分:1)

您可能应该有一个参考表,其中包含以下列:

  • 分类
  • HappyHourTime
  • 高级

然后您可以使用参考表查找值。类似的东西:

dtpBirth.Value = DateTime.Now;

这与您的第一选择类似。但是,我会有一个合成身份主键,并让另外两列具有唯一约束。此外,您可以考虑将其转换为缓慢变化的维度(具有有效和结束日期),以便随时跟踪变化。

答案 1 :(得分:1)

从SQL服务器的角度来看,最重要的是根据您的第一个建议(类别,时间,折扣)创建一个包含三列的表。然后,您有两个应用程序选项。如果它是.net应用程序,您可以使用类别和时间值执行简单选择作为传递的变量以返回结果集。

或者,如果您希望应用程序中的SQL代码更少,您可以创建如上所示的表,并从如下创建的标量值函数中进行选择:

CREATE FUNCTION [dbo].[fn_Discount]  (@Category Varchar(50), @HappyHour TIME)
RETURNS  DECIMAL(8,2)
AS
BEGIN

 DECLARE @Discount DECIMAL(8,2) = (
    SELECT 
    Discount 
    FROM dbo.HappyHourDiscount
    WHERE Category <= @Category
        AND HappyHour = @HappyHour
    )

    RETURN(@Discount)
END

通过您的应用程序传递该功能的参数。