Sql 将1列数据分隔为2列
我的sql表中有以下数据:Sql 将1列数据分隔为2列,sql,sql-server-2008,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点关门。我
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)
虽然您可以通过聚合来实现这一点,但另一种方法是使用
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;
选择tt.trandate、tt.amount、ttnext.amount
从Tran_表tt左外连接
传输表ttnext
时间(ttnext.tran_日期)<5和
强制转换(ttnext.tran_date as date)=强制转换(tt.tran_date+1 as date)
式中,小时数(tt.tran_date)>=5;
这假设数据符合您在问题中的描述。同一天早上5点之前或早上5点之后的多个值将导致重复行。选择传输日期
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
数量
,Amount_Before_5am=SUM(CASE WHEN CAST('Tran_Date'作为时间)您可以使用聚合有效地完成此操作
选择BusinessDay=CAST(日期添加(hh,-5,TranDate)作为日期)
,金额=总和(当DATEPART(hh,TranDate)>4时,则金额=0结束)
,上午5点之前的金额=
总和(DATEPART(hh,TranDate)时的情况)你能解释一下你用来得到这个结果的逻辑吗?同时指出今天对你来说是什么意思。如果在上午5点之前有一笔金额,但前一天没有相应的金额呢?如果在上午5点之前或之后有多个记录呢?得到结果的目的是因为商店在上午8点开门,下一天关门第五天早上5点。我必须在上午8点到12点之前计算总和,在上午12点到5点之后计算总和,使之成为一天的销售。哇,这个答案非常有效。非常感谢,非常感谢!
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)