MS SQL Server:加载所有数据与聚合,+1往返

时间:2016-09-25 00:57:10

标签: sql sql-server azure razor azure-sql-database

我很想就此问题发表意见。

我需要显示特定日期/时间范围的订单记录列表。然后用#of Order " last" 顺序进行比较。 " Last" 可能意味着 上个月 去年

由于我要显示订单记录列表,我打算从去年的 获取记录 只有一次点击(即连同当前日期/时间范围的记录

,或者,我可以:

  1. 获取当前日期/时间范围的记录,然后
  2. 获取 上个月的订单总数(使用汇总) 去年
  3. 替代方法意味着对数据库进行 2次往返(但返回的数据较少)。或者我应该坚持使用我当前的方法(加载所有记录,包括 上个月 去年 )。

      

    注意:网站和SQL服务器托管在Microsoft Azure Cloud中。但是我们将来可能会转向AWS。

    由于

    输入示例(为简单起见省略了一些字段,包括时间)

    ----------------------------------------------------------------
    | Warehouse Id | Order Id | Product Id | Quantity | Order Date |
    ----------------------------------------------------------------
    |            1 |       10 |          1 |       10 | 2016-09-25 |
    |            1 |        9 |          5 |        5 | 2016-09-24 |
    |            1 |        8 |          4 |        8 | 2016-09-23 |
    |            1 |        7 |          6 |        2 | 2016-09-23 |
    |            1 |        6 |          8 |        1 | 2016-09-23 |
    |            1 |        5 |          1 |        2 | 2016-09-22 |
    |            1 |        4 |          1 |        2 | 2016-09-21 |
    |            1 |        3 |          5 |       10 | 2016-09-21 |
    |            1 |        2 |          5 |       15 | 2016-08-12 |
    |            1 |        1 |          5 |        5 | 2016-08-10 |
    ----------------------------------------------------------------
    

    欲望输出:

    Input:
       WarehouseId: 1
       StartDate: 2016-09-01   End Date: 2016-09-30)
       Comparison type: Last Month (ie. StartDate: 2016-08-01   EndDate: 2016-08-31)
    
    Output:
    Warehouse: xxx
    -------------------------------------------------
    | Order Id | Product Id | Quantity | Order Date |
    -------------------------------------------------
    |       10 |          1 |       10 | 2016-09-25 |
    |        9 |          5 |        5 | 2016-09-24 |
    |        8 |          4 |        8 | 2016-09-23 |
    |        7 |          6 |        2 | 2016-09-23 |
    |        6 |          8 |        1 | 2016-09-23 |
    |        5 |          1 |        2 | 2016-09-22 |
    |        4 |          1 |        2 | 2016-09-21 |
    |        3 |          5 |       10 | 2016-09-21 |
    -------------------------------------------------
    Total Order: 40 (increase 100% from last month)
    

    所以,我现在正在做的是从2016-08-01到2016-09-30获取所有记录。这样我可以避免两次往返。

    或者,我可以执行以下操作:

    1. Get record from 2016-09-01 to 2016-09-30
       var rec = (from rec in tblOrders
                  where (rec.WarehouseId == whsId) && (rec.OrderDate >= startDate) && (rec.OrderDate <= endDate)
                  select rec).ToList();
    2. Then do the SUM of total order from 2016-08-01 to 2016-08-31 for comparison purposes
       var recSum = (from rec in ef.tblOrders
                     where (rec.WarehouseId == whsId) && (rec.OrderDate >= cStartDate) && (rec.OrderDate <= cEndDate)
                     group rec by rec.WarehouseId into grec
                     select new
                     {
                         TotalQty = grec.Sum(x => x.Quantity),
                     }).FirstOrDefault();
    

1 个答案:

答案 0 :(得分:1)

您可以使用窗口函数执行此操作:

select o.*
from (select o.*
             sum(case when datetime is "last month" or "last year" then 1 else 0 end) over () as last_num_orders
      from orders o
     ) o
where o.datetime between @date1 and @date2;

我很不清楚在这种情况下“最后”意味着什么。但是,您可以使用窗口函数执行所需操作,这是首选选项0