将1列数据分成2列

时间:2013-05-22 15:31:47

标签: sql sql-server-2008

我的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

希望你们都能帮助我。我差不多一周尝试以下代码但什么都没得到。有可能吗?感谢

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)

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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点之后的多个值会导致重复的行。

答案 2 :(得分: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。