Sql 基于两个日期字段汇总表
我有一个简化的表格,它有两个日期字段和一个金额字段。其中一个日期字段包含订单日期,另一个字段包含发货日期。我被要求按日期分组报告订购和装运的金额 我使用了一个自连接,它似乎工作得很好,但我发现它在没有接受新订单的日期不起作用,而订单是发货的。如果有人能帮我找出解决问题的最佳方法,我将不胜感激。(见下文) 我使用的Sql 基于两个日期字段汇总表,sql,visual-foxpro,Sql,Visual Foxpro,我有一个简化的表格,它有两个日期字段和一个金额字段。其中一个日期字段包含订单日期,另一个字段包含发货日期。我被要求按日期分组报告订购和装运的金额 我使用了一个自连接,它似乎工作得很好,但我发现它在没有接受新订单的日期不起作用,而订单是发货的。如果有人能帮我找出解决问题的最佳方法,我将不胜感激。(见下文) 我使用的T-SQL语句如下: select a.ddate, a.soldamt, b.shippedamt from (select order_date as d
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日的发货量没有显示,显然是因为该日没有新订单
需要注意的是,这是在使用
T-SQL
语法的visualfoxpro
表中完成的,因此在更流行的数据库中发现的一些功能不存在(例如,PIVOT
)最简单的更改是使用完整的外部联接,而不是左联接。完全联接结合了右联接和左联接,包括两个方向上不匹配的记录
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
最简单的更改是使用完全外部联接而不是左联接。完全联接结合了右联接和左联接,包括两个方向上不匹配的记录
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
另一种方法(除了完全外部联接
)是使用联合所有
和附加聚合:
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
值。另一种方法(除了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
值。这是另一个很好的建议。谢谢这是另一个很好的建议。谢谢