我有一张表,其简化形式有两个日期字段和一个金额字段。其中一个日期字段包含订单日期,其中一个字段包含发货日期。我被要求报告按日期分组的订购和发货数量。
我使用了似乎工作正常的自我加入,除了我发现它在没有新订单的日期不起作用,但订单已发货。我很感激任何帮助,找出如何最好地解决问题。 (见下文)
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
)
答案 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
值减少。