Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 基于两个日期字段汇总表_Sql_Visual Foxpro - Fatal编程技术网

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
值。

这是另一个很好的建议。谢谢这是另一个很好的建议。谢谢