根据两个日期字段汇总 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
值。
我有一个 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
值。