2014-03-26 62 views
0

我在我的salesOrderheader表中有Shipdate和Totaldue列。试图获得每月日期的销售额

我当前的查询是这样的

select 
    [ShipDate], SUM([TotalDue]) Total 
from 
    Sales.SalesOrderHeader 
where 
    [ShipDate] between '2005-08-1' and '2005-08-31' 
group by 
    [ShipDate] 

这将返回总销售额的每一天,我想每个日期列对应的值造成的结果,显示本月至今销售(即totaldue这里)。就像如果总到期2005年8月1日为$ 1000,由于总为2005年8月2日是$ 3000,由于总为2005年8月3日为$ 6000那么结果应该是,

ShipDate  MTD Value 
----------------------- 
2005-08-1  1000 
2005-08-2  4000 
2005-08-3 11000 

依此类推,直到2008-08-31。我对数据库很陌生,似乎无法弄清楚这一点。如果有人知道如何做到这一点,请帮助我。由于

+0

的SQL Server版本您使用的? –

+0

SQL Server 2012 –

+0

是这个adventureworks 2012吗? –

回答

0

你可以做这样的:

select soh1.ShipDate, SUM(soh2.TotalDue) from 
    (select distinct ShipDate from sales.SalesOrderHeader 
     where ShipDate < '2005-09-01' and ShipDate >= '2005-08-01') as soh1 
    join sales.SalesOrderHeader soh2 
     on soh2.ShipDate <= soh1.ShipDate and soh2.ShipDate >= '2005-08-01' 
    group by soh1.ShipDate order by soh1.ShipDate 

的加盟将创建以下结果集:

  • 并按ShipDate MTD值
  • 2005年8月1日1000
  • 2005- 08-2 1000
  • 2005-08-2 4000
  • 2005年8月3日1000
  • 2005年8月3日4000
  • 2005年8月3日11000

和点心和GROUP BY加入日期togheter。

+0

谢谢,我想这似乎是工作。我需要一段时间才能理解它。但是,如果我可能会问,我从来没有看到<=操作符在连接条件之前使用,并且Subquery也给出了一个日期作为结果,因此我们可以将它视为加入SalesOrderHeader表的表。再次感谢你的帮助。 :) –

+0

你可以加入你想要的任何列或值。它不一定是一个外键。子查询创建一个结果集,您可以对其他表执行附加查询,甚至可以与其他表联合。 –

+0

谢谢解释。 –

0

这工作和表现相当不错:

;with soh as (
    select ShipDate, sum(TotalDue) as TotalDue 
    from Sales.SalesOrderHeader 
    where ShipDate between '20050801' and '20050831' 
    group by ShipDate 
) 
select ShipDate, sum(TotalDue) over(order by ShipDate) as Total 
from soh 
相关问题