2013-05-22 56 views
-1

我在SQL表以下數據:單獨的1列數據,以2列

Tran_Date   | Amount 
2013-05-01 20:09:49 | 50.00 
2013-05-02 04:09:49 | 50.00 
2013-05-02 04:30:49 | 10.00 
2013-05-02 20:09:49 | 500.00 
2013-05-03 03:09:49 | 0.00 

如何上午05點之前量分開,今天第二天?結果應該如下。獲得結果的目的是因爲商店在早上8點開門,在第二天早上5點關門。我必須在上午8點到上午12點之前計算總和,並在上午12點到上午5點之後將其作爲1天的銷售額。

Tran_Date  | Amount | Amount_Before_5am 
2013-05-01 20:09:49 | 50.00 |  60.00 
2013-05-02 20:09:49 | 500.00 |  0.00 

希望大家能幫助我。我正在嘗試下面的代碼將近1周,但什麼都沒有。有可能這樣做嗎?由於

select CAST(DATEADD(hh, -5,c.TRAN_DATE) AS DATE), 
     CAST(c.TRAN_DATE as DATE), 
     sum(c.Amount) 
from TRAN_TABLE 
group by CAST(DATEADD(hh, -5,c.TRAN_DATE) AS DATE), 
     CAST(c.TRAN_DATE as DATE) 
+1

能否請你拼出你用得到這個結果的邏輯?同時指出你的情況下「今天」的含義。 –

+0

如果上午5點前有金額,但前一天沒有相應金額,該怎麼辦?上午5點之前或之後有多條記錄怎麼辦? –

+0

獲得結果的目的是因爲店鋪早上8點開門,第二天早上5點關門。我必須在上午8點到上午12點之前計算總和,並在上午12點到上午5點之後將其作爲1天的銷售額。 –

回答

1

您可以使用聚合來有效地執行此操作。

http://sqlfiddle.com/#!3/615d5/2

SELECT BusinessDay = CAST(DATEADD(hh,-5,TranDate) AS DATE) 
     ,Amount = SUM(CASE WHEN DATEPART(hh,TranDate) > 4 THEN Amount ELSE 0 END) 
     ,Amount_Before_5am = 
     SUM(CASE WHEN DATEPART(hh,TranDate) <= 4 THEN Amount ELSE 0 END) 
FROM Table 
GROUP BY CAST(DATEADD(hh,-5,TranDate) AS DATE) 
+0

哇,這個答案工作完美。非常感謝,並讚賞它! –

0

雖然你可以做到這一點與聚集,另一種方法是使用join

select tt.trandate, tt.amount, ttnext.amount 
from Tran_table tt left outer join 
    Tran_Table ttnext 
    on hour(ttnext.tran_date) < 5 and 
     cast(ttnext.tran_date as DATE) = CAST(tt.tran_date + 1 as DATE) 
where hour(tt.tran_date) >= 5; 

這是假設數據符合的問題你的描述。在上午5點之前或上午5點之後的多個值會導致重複的行。

0
SELECT Tran_Date 
    , Amount 
    , Amount_Before_5am = SUM(CASE WHEN CAST('Tran_Date' AS TIME) <'05:00:00' THEN Amount ELSE 0 END) 
FROM TRAN_TABLE 
GROUP BY Tran_Date, Amount 

很難告訴你的問題,如果你是否正在聚合。如果你是,那麼這應該工作。如果你不聚合,那麼就把SUM()關掉。您也可以像其他人一樣使用DATEPART比較。

哦,你可能想要每天總結金額?只需將其包裝在SUM()中,並從Group By子句中移除Amount。