你的位置:首页 > 软件开发 > 数据库 > 由最近修改的一个报表想到的

由最近修改的一个报表想到的

发布时间:2015-09-25 15:00:08
最近接到新的需求,要求对一个很古老的报表(酒店销售报表hotel sales report)进行修改和优化,原来这个报表包含两种订单来源的订单,HBS和PBS,现在的需求是,一是要分别限制HBS和PBS的订单范围,二是要增加一列,显示订单的取消原因,取消原因分风控过程取消和非风控 ...

由最近修改的一个报表想到的

    最近接到新的需求,要求对一个很古老的报表(酒店销售报表hotel sales report)进行修改和优化,原来这个报表包含两种订单来源的订单,HBS和PBS,现在的需求是,一是要分别限制HBS和PBS的订单范围,二是要增加一列,显示订单的取消原因,取消原因分风控过程取消和非风控过程取消。

    第一个需求,分别限制HBS和PBS的订单范围,但是这个限定的逻辑和标准还不太一样,所以我的想法是,创建一个自定义函数function,输入订单号OrderID,具体的逻辑封装在这个函数内,然后这个函数返回一个布尔值就可以。

    对于第二个需求,加一列显示订单取消原因,我的想法是,先把风控过程取消的订单和取消原因拿出来做为第一个集合,然后再把非风控过程取消的订单和取消原因取出来作为第二个集合,再将这两个集合UNION ALL,得到所有取消订单及取消原因的集合,在查询的时候LEFT JOIN这个集合就可以。

    这个报表所关联的订单表数据量非常大,所以查询时的性能问题也必须得考虑。

函数的使用

当我们要封装一段业务逻辑,并返回一个结果的时候,可以选择使用函数。比如我这里的第一个需求,封装了HBS和PBS界定订单范围的逻辑,返回布尔值结果,是否属于这个范围就可以。

函数也分为标量函数和表值函数,标量函数返回一个值,而表值函数返回多个值(或者说一个表)。我这里使用的就是标量函数。如下代码。

USE HotelDB;GO--UDF,判断订单是否成功提交永安--如果是HBS订单,依据OrderID,关联OrderLog表,查询是否有【提交成功】的邮件,如果存在则为true,否则为false--如果是PBS携程订单,只要成功创建永安(本地)订单的都作为‘成功提交永安的订单’。IF OBJECT_ID('dbo.fn_GetIsSuccessSubmitWingon') IS NOT NULL  DROP FUNCTION dbo.fn_GetIsSuccessSubmitWingon;GOCREATE FUNCTION dbo.fn_GetIsSuccessSubmitWingon  (   @OrderID AS INT ,   @CategoryType AS VARCHAR(50)  )RETURNS INTAS  BEGIN    DECLARE @Result AS INT;    DECLARE @IsPBSOrder AS BIT;    DECLARE @PkgOrderNo AS VARCHAR(10);        IF ( @CategoryType NOT IN ( 'HBS', 'PBS' ) )            --是否PBS订单      IF EXISTS ( SELECT *            FROM  dbo.HotelOrder (NOLOCK) AS hotelOrder            WHERE  hotelOrder.OrderID = @OrderID                AND hotelOrder.OrderType NOT IN ( 1, 2, 3, 4,                               5, 11, 12, 13 )                AND hotelOrder.ResourceFromFlagType = 2 )        SET @IsPBSOrder = 1;      ELSE        SET @IsPBSOrder = 0;    ELSE      IF ( @CategoryType = 'PBS' )        SET @IsPBSOrder = 1;      ELSE        SET @IsPBSOrder = 0;         IF ( @IsPBSOrder = 1 )--PBS订单      BEGIN        SET @Result = 1;              --SELECT @PkgOrderNo = orderMapping.MappingID        --FROM  dbo.OrderMapping (NOLOCK) AS orderMapping        --WHERE  orderMapping.HotelOrderID = @OrderID;                --IF EXISTS ( SELECT *        --      FROM  HP580DBSZ.PackageFHDB.dbo.Pkg_OrderLog AS orderLog        --      WHERE  orderLog.PkgOrderNo = @PkgOrderNo        --          AND orderLog.OperationType = 1--成功提交度假订单        --          AND orderLog.Operator = 'System' )        --  SET @Result = 1;        --ELSE        --  SET @Result = 0;                    END;    ELSE      BEGIN        IF EXISTS ( SELECT *              FROM  dbo.HotelOrderLog (NOLOCK) AS orderLog              WHERE  orderLog.OrderID = @OrderID                  AND orderLog.OperationType = 4--发邮件                  AND orderLog.NewOrderStatus = 10                  AND orderLog.Remark LIKE N'【提交成功】%' )          SET @Result = 1;        ELSE          SET @Result = 0;      END;        RETURN @Result;  END;

原标题:由最近修改的一个报表想到的

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录