了传统的临时表来实现。如下代码。
--2,非风控过程取消订单
SELECT hotelOrder.OrderID ,
hotelOrder.CreateTime ,
hotelOrder.CancelReason
INTO#NoCardRiskCancelOrders
FROMdbo.HotelOrder (NOLOCK) AS hotelOrder
LEFT JOIN dbo.HotelOrderExtend AS orderExtend ON orderExtend.OrderID = hotelOrder.OrderID
WHERE hotelOrder.OrderStatus = 40
AND orderExtend.CardRiskStatus IS NULL
AND ( @BegBookingDate IS NULL
OR hotelOrder.CreateTime >= @BegBookingDate
)
AND ( @EndBookingDate IS NULL
OR hotelOrder.CreateTime < DATEADD(ms, -4,
DATEADD(d, 1,
@EndBookingDate))
);
--暂时将结果集放到临时表中
SELECT *
INTOdbo.#t1
FROMdbo.#CardRiskCancelOrders
UNION ALL
SELECT *
FROMdbo.#NoCardRiskCancelOrders;
?
?
?
输出的字段有多种情形时使用CASE...WHEN
?
我们的报表有些字段展示很多时候有多种情形,每个情形显示的结果不一样,一般我们可以在SELECT中使用CASE...WHEN来实现。
?
比如,这个报表中字段NoShowStatus的展示逻辑是这样的。
?
?
CASE WHEN BalanceType = 'PP' THEN ''
?
?WHEN OrderStatusFlag & 2048 = 2048 THEN N'否'
?
?WHEN OrderStatusFlag & 16384 = 16384 THEN N'是'
?
?WHEN OrderStatusFlag & 8192 = 8192 THEN N'?核中'
?
?WHEN OrderStatusFlag & 4096 = 4096 THEN N'未?核'
?
?ELSE N'否'
?
END NoShowStatus ,
?
?
你真的会用联接查询吗
?
我们一般使用得比较多的是内联接查询(INNER JOIN)和外联接查询(LEFT JOIN)这两种。
?
内联接查询有两个处理步骤:笛卡尔积运算和过滤。
?
外联接查询有三个处理步骤:笛卡尔积运算,过滤和添加外部行。
?
要理解外部行,首先要明白什么是保留行,保留行指的是LEFT关键字左边的那些行,添加外部行,就是保留行中按照ON条件在另一个表找不到与之匹配的那些行,然后把这些行添加到LEFT左边生成的结果表中,需要注意的是,对于来自联接的非保留表的那些列,添加的外部行中的这些列的值为NULL。
?
对于外联接,如果只是做联接,是不会影响最终输出的记录数的,只有使用在WHERE语句中才会影响最终输出的记录数的。
?
?
性能很重要
?
对于报表来说,性能很重要。
?
通常我们可以通过以下几个手段来提高性能。
?
1,缩小查询范围。缩小查询范围相当于减少数据量。比如有查询条件预订日期的,我们可以带上这个条件。
?
2,合理使用联接查询。有些使用内联接和外联接都可以的情况下,尽量使用内联接,因为外联接会添加外部行,增加数据量。
?
3,相关字段建立索引,这是比较通常的做法。