我有下表:
SalesDate smalldatetime,
ProductId varchar(20),
QuantitySold tinyint,
Price smallmoney
我想获得每种产品的最后1m,3m,1y总量。我如何在一个查询中执行此操作?到目前为止,我的尝试是运行三个单独的查询,每个时间段一个,然后使用UNION组合它们。有没有更好的办法?我正在使用MS SQL 2008。
答案 0 :(得分:4)
您可以使用多列更轻松地执行此操作:
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()
的时间,但您可能采用完全不同的方式来获取" as-of" date。)
因为时间段重叠,所以使用列(和条件聚合)比使用每个时间段的单独行更容易。