Нужно вычитать, пока значение не достигнет предела / предсказать, когда запас заканчивается - PullRequest
0 голосов
/ 08 мая 2018

Я работаю над запросом, который имеет эти две таблицы: Таблица A:

Store       NumItems
1           500
2           1000
3           575 

Таблица B:

Store   Day             ItemsSold
1       Monday          100
1       Tuesday         200
1       Wednesday       110
1       Thursday        10
1       Friday          1
1       Saturday        140
1       Sunday          90
2       Monday          400
2       Tuesday         150
2       Wednesday       501
2       Thursday        190
2       Friday          600
2       Saturday        180
2       Sunday          21
3       Monday          100
3       Tuesday         1050
3       Wednesday       108
3       Thursday        102
3       Friday          51
3       Saturday        40
3       Sunday          15

Мне нужно знать, когда в магазине кончатся товары. Я могу получить дату недели, в которую я запускал процесс, но мне нужно зациклить или каким-то образом продолжать вычитать из каждого магазина и поместья (Предположим, это запускается в понедельник - в магазине 1 в магазине 1 в магазине 1 закончится в субботу, Магазин 2 закончится в среду, магазин 3 закончится во вторник).

Заранее всем спасибо за помощь !!!

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Вы можете попробовать это.

напишите CTE, чтобы вычислить сумму разницы, накопленной за каждый день. Затем получите наибольший отрицательный результат по запросу.

;WITH CTE AS(
    SELECT * 
    FROM(
        SELECT a.Store,a.NumItems,b.Day, a.NumItems- SUM(b.ItemsSold) 
                                            OVER(PARTITION BY B.Store  
                                                    order by case when b.day='Monday'    then 1
                                                                  when b.day='Tuesday'   then 2
                                                                  when b.day='Wednesday' then 3
                                                                  when b.day='Thursday'  then 4
                                                                  when b.day='Friday'    then 5
                                                                  when b.day='Saturday'  then 6
                                                                  when b.day='Sunday'    then 7
                                                end
                                            ROWS BETWEEN UNBOUNDED PRECEDING  AND CURRENT ROW) diffVal
        FROM A 
        INNER JOIN B ON A.Store = B.Store
    )t
)
SELECT t.Store,t.Day 
FROM CTE t
WHERE exists (SELECT MAX(diffVal) FROM CTE WHERE diffVal < 0 GROUP BY Store HAVING t.diffVal = MAX(diffVal))

sqlfiddle: http://sqlfiddle.com/#!18/2a472/1

0 голосов
/ 08 мая 2018

Вам просто нужна накопительная сумма:

select b.*
from a join
     (select b.*,
             sum(itemsold) over (partition by store order by date) as running_itemssold
      from b
     ) b
     on a.store = b.store
where a.numitems > b.running_itemssold - itemsold and
      a.numitems <= b.running_itemsold;

Считается, что количество проданных товаров равно нулю. Если вам действительно нужен короткий товар, вам нужно изменить условия, чтобы второе было <, а не <=.

0 голосов
/ 08 мая 2018

Предполагая, что sum функция окна поддерживается, вы можете сделать

select top 1 with ties store,day
from (select a.store,b.day,
      a.numItems-sum(b.itemsSold) over(partition by b.store 
                                       order by case when b.day='Monday' then 1
                                                     when b.day='Tuesday' then 2
                                                     --/*fill remaining values*/...
                                                end
                                      ) as rem
      from tblA a
      join tblB b on a.store=b.store
     ) t 
where rem <= 0
order by row_number() over(partition by store order by rem desc) 

Идея состоит в том, чтобы вычесть промежуточную сумму itemsSold из общего количества товаров в порядке day и получить первую строку, в которой эта разница <= 0. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...