SQL Промежуточный итог по спецификации c часть - PullRequest
1 голос
/ 05 мая 2020

Требуется вычисление типа промежуточной суммы на основе указанного c уровня детализации количества заказа товара. У меня есть инвентарь по позициям (на момент создания отчета).

    create table SALES (
    ID INT,
    PART VARCHAR(12),
    QTY INT)

    CREATE TABLE INVENTORY (
    ID INT,
    PART VARCHAR (12),
    QTY INT)

INSERT INTO SALES (ID, PART, QTY)
VALUES (1, 1260, 10), 
(2, 1260, 10),
(3, 1153, 5),
(4, 1260, 5),
(5, 279, 20)

INSERT INTO INVENTORY (ID, PART, QTY)
VALUES (1000, 1260, 20),
(1010, 1153, 0),
(1100, 279, 100)

Загрузив данные выше, я получаю следующие результаты:

  SELECT A.ID AS 'ORDER ID', A.PART, A.QTY AS 'SALES QTY' , B.QTY AS 'INVENTORY'
    FROM SALES A 
    LEFT OUTER JOIN INVENTORY B ON A.PART = B.PART
    ORDER BY 2

ORDER ID    PART    SALES QTY   INVENTORY
3           1153    5           0
4           1260    5           20
1           1260    10          20
2           1260    10          20
5           279     20          100

Я ищу промежуточную сумму по частям на каждом уровне строки заказа, как показано ниже (прогноз):

ORDER ID    PART    SALES QTY   INVENTORY   PROJECTED
3           1153    5           0           -5
4           1260    5           20          15
1           1260    10          20          5
2           1260    10          20          -5
5           279     20          100         80

Я новичок на сайте, много раз использовал в прошлом вопросы других пользователей ..... если я разместил что-то в неправильном формате, я прошу прощения. Спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Вы можете использовать оконные функции. Однако вам нужен столбец для заказа, и неясно, какой из них вы бы здесь использовали. Я обозначил это знаком вопроса (?):

select 
    s.id order_id, 
    s.part, 
    s.qty sales_qty, 
    i.qty inventory,
    i.qty - sum(s.qty) over(partition by s.part order by ?) projected
from sales s
left outer join inventory i on i.part = s.part
order by 2
0 голосов
/ 05 мая 2020

Звучит как оконная функция и арифметика c:

SELECT S.ID AS ORDERID, S.PART, S.QTY AS SALESQTY , I.QTY AS INVENTORY,
       SUM(I.QTY) OVER (PARTITION BY S.PART ORDER BY S.ID) - S.QTY
FROM SALES S LEFT JOIN
     INVENTORY I
     ON I.PART = S.PART
ORDER BY 2
...