2015-06-19 59 views
0

我有一個表格,它的簡化形式有兩個日期字段和一個金額字段。其中一個日期字段包含訂單日期,其中一個字段包含發貨日期。我被要求報告按日期分組的訂購數量和發貨量。基於兩個日期字段的彙總表

我使用了自我連接,似乎工作正常,除了我發現它不適用於沒有新訂單的日期,但訂單已發貨。我很感激任何幫助,找出如何最好地解決這個問題。 (見下文)

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

回答

3

最簡單的變化是使用是很重要的一個完整的外部連接而不是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 
+0

謝謝!那就是訣竅。 – user3561813

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

+0

這是另一個很棒的建議。謝謝! – user3561813