2014-03-26 63 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 
相關問題