首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL提供带有预定义规则的数据。

SQL提供带有预定义规则的数据。
EN

Stack Overflow用户
提问于 2016-11-02 09:34:47
回答 2查看 73关注 0票数 0

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

让我们假设如下:我想计算顾客的折扣。我有客户类别,"HappyHours“和折扣。

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

示例:

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

等等..。

这是针对应用程序的,每次执行都需要折扣。所以很高兴能找到一种既干净又快捷的方法。

我想到了两种可能性:

  1. 一次手动填充一次复合主键(类别和happyHour)的表
  2. 硬编码赋值函数(类似于the number of matches between two rows mysql)

你认为如何?有没有一种更有活力的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 10:49:22

您可能应该有一个参考表,其列如下:

  • 类别
  • HappyHourTime
  • 补价

然后,您可以使用引用表查找这些值。类似于:

代码语言:javascript
复制
select t.*, r.premium
from t join
     reference r
     on t.category = r.category and t.happyhourtime = r.happyhourtime;

这类似于你的第一选择。但是,我将有一个合成标识主键,并有另外两个列有一个唯一的约束。另外,您可能会考虑将其转换为一个缓慢变化的维度(有一个有效的结束日期),这样您就可以跟踪随时间变化的情况。

票数 1
EN

Stack Overflow用户

发布于 2016-11-02 10:53:37

从SQL server的角度来看,最简洁的做法是按照第一项建议(类别、时间、折扣)创建三列的表。然后,您可以为应用程序提供两个选项。如果它是一个.net应用程序,您可以使用您的类别和时间值作为变量进行简单的选择,以返回结果集。

或者,如果您想在应用程序中使用更少的SQL代码,可以像上面那样创建表,并从这样创建的标量值函数中进行选择:

代码语言:javascript
复制
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

通过应用程序传递函数的参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40376552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档