34,838
社区成员




if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T([dateFrom] datetime,[dateTo] datetime,userid NVARCHAR(100),amount INT)
Insert #T
select '2011/10/1 1:00',null,N'u1',20 union all
select '2011/10/1 2:00',null,N'u1',52 union all
select '2011/10/1 3:00',null,N'u2',14 union all
select '2011/10/1 3:00',null,N'u4',58 union all
select '2011/10/2 4:00',null,N'u1',47 union all
select '2011/10/2 4:00',null,N'u2',95 union all
select '2011/10/2 4:00',null,N'u4',56 union all
select '2011/10/3 5:00',null,N'u1',58 union all
select '2011/10/3 4:00',null,N'u2',69
Go
with cte_1
as
(select CONVERT(varchar(10),dateFrom,23) as datefrom,dateTo,userid,SUM(amount) as amount
from #T
group by CONVERT(varchar(10),dateFrom,23),dateTo,userid),
cte_2
as
(select *,min(datefrom) over (partition by 1) as min_date,ROW_NUMBER() over (order by datefrom,userid) as seq_1 from cte_1),
cte_3
as
(select * from cte_2 A
outer apply (select SUM(amount) as subtotal from cte_2 where seq_1<=A.seq_1) as B)
select case when DATEDIFF(DAY,datefrom,dateto_new)<=1 then datefrom else DATEADD(DAY,-1,dateto_new) end as datefrom,
dateto_new as dateto,
userid,
amount,
subtotal
from
(select *,DATEADD(DAY,qty_time,min_date) as dateto_new
from
(select *,subtotal/100 as qty_time from cte_3) as A) as A
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
CREATE TABLE #T([dateFrom] datetime,[dateTo] datetime,userid NVARCHAR(100),amount INT)
Insert #T
select '2011/10/1 1:00',null,N'u1',20 union all
select '2011/10/1 2:00',null,N'u1',52 union all
select '2011/10/1 3:00',null,N'u2',14 union all
select '2011/10/1 3:00',null,N'u4',58 union all
select '2011/10/2 4:00',null,N'u1',47 union all
select '2011/10/2 4:00',null,N'u2',95 union all
select '2011/10/2 4:00',null,N'u4',56 union all
select '2011/10/3 5:00',null,N'u1',58 union all
select '2011/10/3 4:00',null,N'u2',69
Go
--测试数据结束
;WITH tempa AS (
SELECT CONVERT(NVARCHAR(100), datefrom, 23) AS datefrom ,
CONVERT(NVARCHAR(100), dateto, 23) AS dateto ,
userid ,
SUM(amount) AS amount
FROM #T
GROUP BY CONVERT(NVARCHAR(100), datefrom, 23) ,
CONVERT(NVARCHAR(100), dateto, 23) ,
userid
),tempb AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY datefrom) AS num FROM tempa
),ctempc AS (
SELECT
a.num,
datefrom ,
dateto,
userid ,
amount ,
( SELECT SUM(amount)
FROM tempb b
WHERE b.num <= a.num
)%100 AS 累计
FROM tempb a )
SELECT a.datefrom ,
CASE WHEN a.amount + b.累计 >= 100 THEN DATEADD(DAY, 1, a.datefrom)
ELSE a.datefrom
END AS dateto ,
a.userid ,
a.amount
FROM ctempc a
LEFT JOIN ctempc b ON a.num = b.num + 1;