根据两个日期字段汇总 Table

Summarize Table Based on Two Date Fields

我有一个 table,它的简化形式有两个日期字段和一个金额字段。其中一个日期字段包含订单日期,其中一个字段包含发货日期。我被要求报告按日期分组的订购数量和发货数量。

我使用了似乎工作正常的自连接,但我发现它在没有接受新订单但订单已发货的日期不起作用。如果您能帮助我找出解决问题的最佳方法,我将不胜感激。 (见下文)

Order_Date    Shipped_Date    Amount
6/1/2015      6/2/2015        10
6/1/2015      6/3/2015        15
6/2/2015      6/3/2015        17

我使用的T-SQL语句如下:

select a.ddate, a.soldamt, b.shippedamt 
    from 
        (select order_date as ddate, sum(amount) as soldamt from TABLE group by order_date) a  
    left join 
        (select shipped_date as ddate, sum(amount) as shippedamt from TABLE group by shipped_date) b
    on a.order_date = b.shipped_date

这导致:

ddate     soldamt    shippedamt
6/1/2015  15         0
6/2/2015  17         10

没有显示 6/3/2015 的发货数量,显然是因为当天没有新订单。

重要的是要注意这是在 Visual FoxPro table 中使用 T-SQL 语法完成的,因此在更流行的数据库中发现的一些功能不存在(例如, PIVOT)

最简单的更改是使用 FULL OUTER JOIN 而不是 LEFT。完整联接结合了右联接和左联接,包括两个方向上的不匹配记录。

SELECT a.ddate, a.soldamt, b.shippedamt 
FROM 
    (select order_date as ddate, sum(amount) as soldamt from TABLE group by order_date) a  
FULL OUTER JOIN 
    (select shipped_date as ddate, sum(amount) as shippedamt from TABLE group by shipped_date) b
ON a.order_date = b.shipped_date

另一种方法(除了full outer join)是使用union all和一个额外的聚合:

select ddate, sum(soldamt) as soldamt, sum(shippedamt) as shippedamt
from ((select order_date as ddate, sum(amount) as soldamt, 0 as shippedamt
       from TABLE
       group by order_date
      ) union all 
      (select shipped_date as ddate, 0, sum(amount) as shippedamt
       from TABLE
       group by shipped_date
      )
     ) os
group by ddate;

这也会导致更少的 NULL 值。