基于两个日期字段的表总结

时间:2015-06-19 15:27:21

标签: sql visual-foxpro

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

我使用了似乎工作正常的自我加入,除了我发现它在没有新订单的日期不起作用,但订单已发货。我很感激任何帮助,找出如何最好地解决问题。 (见下文)

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

2015年6月3日发货的金额不会出现,显然是因为该日没有新订单。

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

2 个答案:

答案 0 :(得分:3)

最简单的改变是使用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

答案 1 :(得分:1)

另一种方法(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值减少。