-1

我的 sql 表中有以下数据:

 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

如何区分今天和第二天早上 5 点之前的金额?结果应该如下。获得结果的目的是因为商店早上 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)
4

3 回答 3

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)
于 2013-05-22T16:11:47.773 回答
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:00 之后的多个值会导致重复行。

于 2013-05-22T15:39:35.363 回答
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 即可。

于 2013-05-22T16:09:56.770 回答