2013-07-08 23 views
0

我需要從兩列返回每日SUM,覆蓋7個月 我正在嘗試這樣做,但這太費時。有沒有一種方法可以按順序將這些按順序遞增一天?我需要從兩列返回每日SUM,覆蓋7個月

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/1/2013 07:00:00' and '1/2/2013 7:00:00' 

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/2/2013 07:00:00' and '1/3/2013 7:00:00' 

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/3/2013 07:00:00' and '1/4/2013 7:00:00' 

select SUM(TotalBet)SALES, SUM(totalbet)PRIZES from play nolock where CurrentDate between '1/4/2013 07:00:00' and '1/5/2013 7:00:00' 

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/5/2013 07:00:00' and '1/6/2013 7:00:00' 

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/6/2013 07:00:00' and '1/7/2013 7:00:00' 
+0

CurrentDate列索引?如果沒有,請考慮索引它,這將提高此類請求的性能 –

+0

CurrentDate已編入索引 – KevinW

回答

1

您想要聚合。關鍵是將datetime轉換爲date。爲了得到正確的日期,減去7小時:

select cast(CurrentDate - 7.0/24 as date) as thedate, 
     SUM(TotalBet) as SALES, SUM(totalbet) as PRIZES 
from play nolock 
group by cast(CurrentDate - 7.0/24 as date) 
order by 1; 
+0

我剛剛進行了更新,其中時間範圍需要從7:00:00到6:59:59 – KevinW

1

使用numbers table生成您的日期,然後加入到表中並按天分組。你可以直接進入桌子,但是如果你缺少日期(比如假期),他們將不會在沒有數字表的結果中顯示。

SELECT 
    D.Date, SUM(TotalBet) as Sales, SUM(TotalBet) as Prizes 
FROM (
    SELECT DATEADD(dd, CONVERT(datetime, '2013-01-01 07:00'), Number) as Date 
    FROM dbo.NumbersTable(0, 210) --210 days 
) as D 
LEFT OUTER JOIN Play as P ON 
    P.CurrentDate >= D.Date AND P.CurrentDate < D.Date 
GROUP BY 
    D.Date 

你也(可能)希望之間沒有用,因爲你可以與邊界重複結束(之間包括兩側)。

+0

現在我意識到了。我更新了請求從7:00:00運行到6:59:59 – KevinW

+0

@KevinW - 你仍然會錯過毫秒。只要做到「正確」的方式,並使用嚴格的'<'一邊。切勿在生產工作中使用BETWEEN。 –

0

我猜了一下,在你以後,但我認爲以下工作:

select 
    AdminDate, 
    SUM(TotalBet) SALES, 
    SUM(totalbet) PRIZES --Unless the DB has a CS collation, this is identical to the above 
from 
    (select 
     DATEADD(day,DATEDIFF(day,0,DATEADD(hour,-7,CurrentDate)),0) as AdminDate, 
     TotalBet 
    from play 
    ) t 
where AdminDate >= '20130101' and AdminDate < '20130801' 
group by AdminDate 
order by AdminDate asc 

(請注意,這會不會是能夠從使用索引雖然受益 - 如果該事項,考慮加入AdminDate爲計算列表)

的關鍵是要建立這個AdminDate列,其中第一減去7小時從CurrentDate,然後從中刪除時間組件結果 - 這樣做的結果是,從今天上午7點到明天上午7點之前的每個日期時間值將作爲管理目的被視爲發生「今天」。一旦我們有這些AdminDate s,很容易對這些人執行GROUP BY以找出每個AdminDay的總數。


NB我還從查詢中刪除nolock因爲它不這樣做,你認爲它是什麼做的。在您的原始查詢中,它爲play表引入nolock的別名。如果你真的需要需要查詢不要在表上執行任何鎖定,你想使用WITH (NOLOCK)

+0

我無法編輯實際數據,添加一列不是選項。 – KevinW

+0

謝謝,我被告知不然。我會更新 – KevinW