#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 с вашими примерами данных , и это работает.