2016-12-01 4 views
2

У меня есть некоторые данные, как показано ниже;SQL для ниже требования

select * into #temp from (
select getdate() Dt,20 Qt 
union all 
select getdate()-1 Dt,70 Qt 
union all 
select getdate()-1 Dt,20 Qt 
union all 
select getdate()-2 Dt,50 Qt 
union all 
select getdate()-4 Dt,40 Qt 
union all 
select getdate()-4 Dt,80 Qt 
union all 
select getdate()-6 Dt,20 Qt 
) a 

Настоящие данные относятся к количеству изделий, произведенных в определенные дни в партии в каждый момент времени. В любой момент времени я могу отправить только количество < 100, а также на основе партий. Так что, если счет превышает 100, доставка число превышает и результат должен выглядеть, как показано ниже

date      QT shipnum 
2016-11-25 03:45:45.897  20 1 
2016-11-27 03:45:45.897  40 1 
2016-11-27 03:45:45.897  80 2 
2016-11-29 03:45:45.897  50 3 
2016-11-30 03:45:45.897  70 4 
2016-11-30 03:45:45.897  20 4 
2016-12-01 03:45:45.897  20 5 

Может КТР быть использованы для достижения этой цели. Если еще, как достичь этого

+1

Есть ли у вас так, как вы можете заказать эту таблицу? Всегда ли это в порядке даты? –

+0

Привет, Rich, если вы наблюдаете выходные данные из исходных данных, которые я предоставил, его упорядоченный по столбцу даты. Таким образом, обработка начинается с даты, а количество отправления присваивается счетчиком из QT – sree

+0

Qt с 50 должно быть 2 (shipnum) вправо ?. потому что сумма составляет 190 (20 + 40 + 80 + 50) – Buddi

ответ

3

Какую версию вы используете?

Вы можете попробовать этот скрипт:

SELECT *,SUM(qt)OVER(ORDER BY rn) AS [sum],SUM(qt)OVER(ORDER BY rn)/100+1 AS shipnum FROM (
    SELECT *,ROW_NUMBER()OVER(ORDER BY dt) AS rn FROM #temp 
) t 
 
Dt      Qt   rn     sum   shipnum 
----------------------- ----------- -------------------- ----------- ----------- 
2016-11-25 17:29:16.280 20   1     20   1 
2016-11-27 17:29:16.280 40   2     60   1 
2016-11-27 17:29:16.280 80   3     140   2 
2016-11-29 17:29:16.280 50   4     190   2 
2016-11-30 17:29:16.280 70   5     260   3 
2016-11-30 17:29:16.280 20   6     280   3 
2016-12-01 17:29:16.280 20   7     300   4 
+0

решил мою цель – sree

0

Heres решение с помощью курсора - обратите внимание, я сделал даты, уникальные для упрощения этого примера

/* 
drop table #temp 
select * into #temp from (
select getdate() Dt,20 Qt, null ino 
union all 
select getdate()-1 Dt,70 Qt, null ino 
union all 
select getdate()-2 Dt,20 Qt, null ino 
union all 
select getdate()-3 Dt,50 Qt, null ino 
union all 
select getdate()-4 Dt,40 Qt, null ino 
union all 
select getdate()-5 Dt,80 Qt, null ino 
union all 
select getdate()-6 Dt,20 Qt, null ino 
) a 
*/ 


declare @100 int = 100 
declare @rt int = 0 
declare @ino int = 1 
declare @dt datetime 
declare @qt int 
declare @rn int 

declare sqlcursor cursor for 
Select s.qt,s.dt,s.rn 
from 
(select t.*, row_number() over (order by t.dt) rn 
from #temp t) s 

OPEN sqlcursor 


FETCH NEXT FROM sqlcursor INTO @qt,@dt,@rn 
set @rt = @qt 
update #temp set ino = @ino where @dt = #temp.dt 


WHILE @@FETCH_STATUS = 0 
BEGIN 
     FETCH NEXT FROM sqlcursor INTO @qt,@dt,@rn 
     IF @@FETCH_STATUS = 0 
     if @rt + @qt > @100 
      begin 
       set @ino = @ino + 1 
       set @rt = @qt 
      end 
     else set @rt = @rt + @qt 
     update #temp set ino = @ino where @dt = #temp.dt 
END 

CLOSE sqlcursor 
DEALLOCATE sqlcursor 

select * from #temp order by dt asc 
Смежные вопросы