2014-09-24 113 views
0

我有如下表:SQL查詢組

SalesDate smalldatetime, 
ProductId varchar(20), 
QuantitySold tinyint, 
Price smallmoney 

我想最後1M,3M,1Y每個產品銷售的總量。我如何在一個查詢中做到這一點?到目前爲止,我的嘗試是運行三個單獨的查詢,每個時間段一個,然後使用UNION組合它們。有沒有更好的辦法?我使用MS SQL 2008

+0

不,如果你想讓它們垂直疊放,那麼UNION是最好的選擇。 – 2014-09-24 15:05:38

回答

3

您可以更輕鬆地與多個列做到這一點:

select productId, 
     sum(case when salesdate >= dateadd(month, -1, getdate()) then quantitysold else 0 end) as qs1m, 
     sum(case when salesdate >= dateadd(month, -3, getdate()) then quantitysold else 0 end) as qs3m 
     sum(case when salesdate >= dateadd(month, -12, getdate()) then quantitysold else 0 end) as qs12m 
from table t 
group by productId; 

(注:你可能想至少從getdate()刪除次,但你可能有一個完全不同的獲取「原始」日期的方法。)

由於時間段重疊,因此與列(和條件聚合)相比,對於每個時間段而言,使用單獨的行更容易。

+0

如果「去年」實際上是指當前年份(通常是要求),則使用年份(銷售日期)=年份(getdate())時的情況,那麼......。 – Hogan 2014-09-24 15:13:02

+0

也許值得向查詢添加'WHERE salesdate> = DateAdd(mm,-12,Current_Timestamp)'。 – gvee 2014-09-24 15:17:26