SQL Выбирает до определенной суммы

#sql #sql-server #sql-server-2008-r2

#sql #sql-сервер #sql-server-2008-r2

Вопрос:

Я пытался найти способ написать SQL-скрипт для выбора заданной суммы и был бы признателен за любые идеи, представленные для этого.

Я пытаюсь выполнить оценку запасов на основе дат получения товаров. При закрытии на конец месяца стоимость моих запасов, оставшихся на складе, будет равна указанной сумме последних полученных товаров.

Приведенный ниже запрос выполняется несколькими объединениями, но сводится к:

 SELECT DATE, W1 FROM Table
ORDER BY DATE DESC
  

Результат запроса:

 Row     DATE                W1      
1       2019-02-28 00:00:00 13250   
2       2019-02-28 00:00:00 42610   
3       2019-02-28 00:00:00 41170   
4       2019-02-28 00:00:00 13180   
5       2019-02-28 00:00:00 20860   
6       2019-02-28 00:00:00 19870   
7       2019-02-28 00:00:00 37780   
8       2019-02-28 00:00:00 47210   
9       2019-02-28 00:00:00 32000   
10      2019-02-28 00:00:00 41930   
  

Я думал о решении этой проблемы путем вычисления совокупной суммы следующим образом:

 Row     DATE                W1      Cumulative Sum
1       2019-02-28 00:00:00 13250   13250         
2       2019-02-28 00:00:00 42610   55860         
3       2019-02-28 00:00:00 41170   97030         
4       2019-02-28 00:00:00 13180   110210        
5       2019-02-28 00:00:00 20860   131070        
6       2019-02-28 00:00:00 19870   150940  
7       2019-02-28 00:00:00 37780   188720  
8       2019-02-28 00:00:00 47210   235930  
9       2019-02-28 00:00:00 32000   267930  
10      2019-02-28 00:00:00 41930   309860  
  

Однако я застрял, выясняя способ использования параметра для возврата только интересующих строк.

Например, если параметр был указан как ‘120000’, он вернул бы строки, в которых совокупная сумма равна ровно 120000.

 Row     DATE                W1      Cumulative Sum  W1_Select
1       2019-02-28 00:00:00 13250   13250           13250
2       2019-02-28 00:00:00 42610   55860           42610
3       2019-02-28 00:00:00 41170   97030           41170
4       2019-02-28 00:00:00 13180   110210          13180
5       2019-02-28 00:00:00 20860   131070          9790
                                                    ----------
                                    Total           120000 
  

Комментарии:

1. Я использую MSSQL 2008 R2 Express

Ответ №1:

Это просто требует некоторой арифметики:

 select t.*,
       (case when running_sum < @threshold then w1
             else @threshold - w1
        end)
from (select date, w1, sum(w1) over (order by date) as running_sum
      from t
     ) t
where running_sum - w1 < @threshold;
  

На самом деле, в вашем случае все даты одинаковы. Это немного нелогично, но вам нужно использовать строку, чтобы это сработало:

 select t.*,
       (case when running_sum < @threshold then w1
             else @threshold - w1
        end)
from (select date, w1, sum(w1) over (order by row) as running_sum
      from t
     ) t
where running_sum - w1 < @threshold;
  

Здесь есть db<>fiddle .

Комментарии:

1. Большое вам спасибо, Гордон, я ценю вашу помощь и попробую. Фактический набор данных будет иметь диапазон дат.

2. @yongsheng . . . Это отвечает на вопрос, который вы задали. Если у вас есть другой вопрос, вам следует задать новый вопрос. Обратите внимание, что это включает в себя SQL Fiddle с вашими примерами данных , и это работает.