Как отработать заказы, с которых пришел мой сток? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть две таблицы:

Таблица 1:

Item Number, QTY on Hand

Таблица 2:

Item Number, Description, Received Number, QTY Received, Received Date

Что мне нужно сделать, это найти способ показатькоторые получили заказы, из которых поступил мой запас.

Пример: Item 12345 У меня есть 300 на руках.

Я получил несколько заказов

Order 1 - 100
order 2 - 100
Order 3 - 50
Order 4 - 100
Order x - x
etc

Я предполагаю первымв первую очередь логика. Так что я хотел бы видеть это

Item 12345 - SOH 300 

, и это приказы, из которых он пришел:

Order 1 - 100
order 2 - 100
Order 3 - 50
Order 4 - 50

В конце дня я хочу увидеть что-то вроде этого:

! [Обнадеживающий конечный результат] [1]

попытки

-- Table 1  
select ITEMNO, QTYONHAND 
from iciloc 
where QTYONHAND <> 0 
and LOCATION = 'M'  

-- Table 2  
SELECT PORCPH1.RCPNUMBER, PORCPH1.DATE, PORCPL.ITEMNO, PORCPL.ITEMDESC, PORCPL.RQRECEIVED 
FROM PORCPL 
INNER JOIN PORCPH1 ON PORCPL.RCPHSEQ = PORCPH1.RCPHSEQ 
where PORCPL.ITEMNO in (
  select ITEMNO from iciloc where QTYONHAND <> 0 and LOCATION = 'M'
) 
AND PORCPH1.DATE <= 20100101 
order by ITEMNO

Привет Равиоли,

у меня естьпоэкспериментировал с вашим кодом и внес изменения, чтобы они соответствовали моим таблицам, и похоже, что некоторые из работ skus, а некоторые не пример:

SELECT ICILOC.ITEMNO, PORCPL.RCPHSEQ, PORCPL.RQRECEIVED, PORCPH1.RCPNUMBER, PORCPH1.DATE
FROM ICILOC
LEFT JOIN (
  SELECT 
    PORCPL.ITEMNO, 
    PORCPL.RCPHSEQ,
    PORCPL.RQRECEIVED,
    PORCPL.DTARRIVAL,
    SUM(PORCPL.RQRECEIVED) OVER(
      PARTITION BY PORCPL.ITEMNO -- Calculate inventory per item
      ORDER BY PORCPL.DTARRIVAL DESC -- Order by most recently received
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING -- Cumulative sum, exc. current row
    ) AS CSUM_latest
  FROM PORCPL
) PORCPL ON PORCPL.ITEMNO = ICILOC.ITEMNO -- Get order info
LEFT JOIN PORCPH1 ON PORCPL.RCPHSEQ = PORCPH1.RCPHSEQ
WHERE COALESCE(PORCPL.CSUM_latest, 0) < ICILOC.QTYONHAND -- Only get enough orders to cover SOH
ORDER BY ICILOC.ITEMNO, PORCPL.RCPHSEQ

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

! [Запрос 1] [2]

Запас на складе:

! [SOH] [3]

Как видно из PN 1,должен показывать только квитанцию ​​3, так как она имеет 280 000, а SOH - 266 400

. Это мой идеальный результат:

Так что он показывает только квитанции, которые соответствуют текущему SOH

! [результат, к которому я стремлюсь] [4]



Я немного поработал над следующим

SELECT distinct ICILOC.ITEMNO, PORCPL.RCPHSEQ, PORCPL.RQRECEIVED, PORCPH1.RCPNUMBER, PORCPH1.DATE
FROM ICILOC
LEFT JOIN (
  SELECT 
    PORCPL.ITEMNO, 
    PORCPL.RCPHSEQ,
    PORCPL.RQRECEIVED,
    PORCPL.DTARRIVAL,
    SUM(PORCPL.RQRECEIVED) OVER(
      PARTITION BY PORCPL.ITEMNO -- Calculate inventory per item
      ORDER BY PORCPL.DTARRIVAL DESC -- Order by most recently received
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING -- Cumulative sum, exc. current row
    ) AS CSUM_latest
  FROM PORCPL
) PORCPL ON PORCPL.ITEMNO = ICILOC.ITEMNO -- Get order info
LEFT JOIN PORCPH1 ON PORCPL.RCPHSEQ = PORCPH1.RCPHSEQ
WHERE COALESCE(PORCPL.CSUM_latest, 0) < ICILOC.QTYONHAND -- Only get enough orders to cover SOH
ORDER BY ICILOC.ITEMNO, PORCPL.RCPHSEQ

Единственное, что мне нужно сейчас исправить, этосамая старая квитанция / илиЕсли я не хочу, чтобы это показывало весь заказ, я просто хочу, чтобы это показывало, что многие из них остались

пример

, поэтому под порядком один / два / три я имею в виду:

01.01.2018 я заказал 100 с завода (заказ 1)
01.02.2018 я заказал 20 с завода (заказ 2)
01.03.2018 я заказал 25 с завода (заказ 3)

В настоящее время у меня есть 50 под рукой. Итак, я могу предположить, что:

  • 95 из заказа 1 продано
  • у нас еще осталось 5 от заказа 1
  • у нас еще осталось 20 отзаказ 2
  • у нас все еще есть 25 из заказа 3

при условии, что склад делает первый на первом

, что мы предполагаем, что они

надеюсь, это имеет смысл


* Привет @ ravioli, пожалуйста, смотрите ниже как требуется: вот мой текущий SOH

PN1  48,977 
PN2  44,206 
PN3  14,020 

Это то, что яполучить, когда я запускаю текущий код:

ItemCode    Recipt  Date         received
PN1         RCP1    10/09/2019   25,600 
PN1         RCP2    12/09/2019   25,600 
PN2         RCP3    26/07/2019   21,600 
PN2         RCP4    24/09/2019   36,000 
PN3         RCP5    30/04/2019   7,200 
PN3         RCP6    24/09/2019   7,200 

это то, что я хотел бы видеть

ItemCode    Recipt  Date         received
PN1         RCP1    10/09/2019   23,377 
PN1         RCP2    12/09/2019   22,606 
PN2         RCP3    26/07/2019   21,600 
PN2         RCP4    24/09/2019   36,000 
PN3         RCP5    30/04/2019   6,820 
PN3         RCP6    24/09/2019   7,200 

Таким образом, вместо самой старой квитанции, показывающей полный «полученный», он должен показывать толькочто нужно, чтобы = текущий SOH

______________________________________________________________________________________________________________________________________________________________

Эй, все, только что обновил, я добавил 3 skus в [sqlfiddle] [5]

Вот мой SOH

| ITEMNO | QTYONHAND |
|--------|-----------|
|      1 |    266400 |
|      2 |     19190 |
|      3 |      4025 |

Вот вывод, который я получаю

| ITEMNO | RCPNUMBER |  DTARRIVAL | RQRECEIVED |
|--------|-----------|------------|------------|
|      1 |         3 | 2019-09-24 |     280000 |
|      2 |         4 | 2019-03-20 |       7200 |
|      2 |         5 | 2019-09-10 |       7200 |
|      2 |         6 | 2019-09-24 |       7200 |
|      3 |         7 | 2018-06-27 |      14700 |
|      3 |         8 | 2018-07-06 |       1000 |
|      3 |         9 | 2018-07-06 |       2000 |

Вот что я хотел бы увидеть:

| ITEMNO | RCPNUMBER |  DTARRIVAL | RQRECEIVED |
|--------|-----------|------------|------------|
|      1 |         3 | 2019-09-24 |     266400 |
|      2 |         4 | 2019-03-20 |       4790 |
|      2 |         5 | 2019-09-10 |       7200 |
|      2 |         6 | 2019-09-24 |       7200 |
|      3 |         7 | 2018-06-27 |       1025 |
|      3 |         8 | 2018-07-06 |       1000 |
|      3 |         9 | 2018-07-06 |       2000 |
________________________________________________

Итак, что я хотел бы получить, например:

ITEMNO 3 SOH - 4,025, запас в наличии за три RCPNUMBER

7 - 14,700

8 - 1 000

9 - 2 000

вместо того, чтобы видеть все три, я просто хочу количество, которое добавится к SOH. В этом случае это полный порядок 9 + полный порядок 8 +1025 только из Приказа 7

, поэтому 2000 (заказ 9) + 1000 (заказ 8) + 1025 (часть заказа 7) = 4025 (текущий SOH) ______________________________________________________________________________________________________________________________________________________________

текущий код, которым я доволен

SELECT DISTINCT ICILOC.ITEMNO,PORCPL.ITEMDESC,PORCPH1.RCPNUMBER, PORCPL.RQRECEIVED, CONVERT(datetime, CONVERT(varchar(30),PORCPH1.DATE), 103) as DATE, QTYONHAND,
  CASE 
    WHEN (COALESCE(CSUM_Latest,0) + PORCPL.RQRECEIVED) > QTYONHAND -- Partial order needed for SOH
      THEN (COALESCE(CSUM_Latest,0) + PORCPL.RQRECEIVED) - QTYONHAND -- Diff. of cum. QTYRec and SOH
    ELSE PORCPL.RQRECEIVED 
  END AS QTYReceived_SOH
  ,PG1_Desc,PG2_Desc,PG3_Desc,PG4_Desc, CONVERT(datetime, CONVERT(varchar(30),GETDATE()), 103) - CONVERT(datetime, CONVERT(varchar(30),PORCPH1.DATE), 103) as AGE,TOTALCOST/QTYONHAND as AVGCOST,
    CASE 
    WHEN CONVERT(datetime, CONVERT(varchar(30),PORCPH1.DATE), 103) > CONVERT(datetime, CONVERT(varchar(30),GETDATE()-365), 103) 
      THEN 'No'
    ELSE 'Yes'
  END AS OLDER_THAN_12_MONTHS
    FROM ICILOC
LEFT JOIN (
  SELECT 
    PORCPL.ITEMNO, 
    PORCPL.RCPHSEQ,
    PORCPL.RQRECEIVED,
    PORCPL.DTARRIVAL,
    PORCPL.ITEMDESC,
    SUM(PORCPL.RQRECEIVED) OVER(
      PARTITION BY PORCPL.ITEMNO -- Calculate inventory per item
      ORDER BY PORCPL.DTARRIVAL DESC -- Order by most recently received
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING -- Cumulative sum, exc. current row
    ) AS CSUM_latest
  FROM PORCPL
) PORCPL ON PORCPL.ITEMNO = ICILOC.ITEMNO -- Get order info
LEFT JOIN PORCPH1 ON PORCPL.RCPHSEQ = PORCPH1.RCPHSEQ
LEFT JOIN Datawarehouse.dbo.Item_Details ON Item_Details.ItemCode COLLATE DATABASE_DEFAULT = ICILOC.ITEMNO COLLATE DATABASE_DEFAULT
    WHERE COALESCE(PORCPL.CSUM_latest, 0) < ICILOC.QTYONHAND and LOCATION = 'M'  -- Only get enough orders to cover SOH
        ORDER BY ICILOC.ITEMNO, PORCPH1.RCPNUMBER;```








  [1]: https://i.stack.imgur.com/WubWp.png
  [2]: https://i.stack.imgur.com/r5lDe.png
  [3]: https://i.stack.imgur.com/ZOwMn.png
  [4]: https://i.stack.imgur.com/hyXiL.png
  [5]: http://sqlfiddle.com/#!18/275dad/20

1 Ответ

0 голосов
/ 08 октября 2019

Вот один из способов сделать это:

SELECT items.ItemNumber, orders.ReceivedNumber, orders.QTYReceived
FROM Items
LEFT JOIN (
  SELECT 
    ItemNumber, 
    ReceivedNumber,
    QTYReceived,
    SUM(QTYReceived) OVER(
      PARTITION BY ItemNumber -- Calculate inventory per item
      ORDER BY ReceivedDate DESC -- Order by most recently received
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING -- Cumulative sum, exc. current row
    ) AS CSUM_latest
  FROM Orders
) orders ON orders.ItemNumber = items.ItemNumber -- Get order info
WHERE COALESCE(orders.CSUM_latest, 0) < items.SOH -- Only get enough orders to cover SOH
ORDER BY items.ItemNumber, orders.ReceivedNumber

Имена таблиц / столбцов основаны на предоставленном вами описании, а не на фактическом SQL / DDL. Вам нужно будет настроить его в соответствии с вашей фактической моделью. Попробуйте и дайте мне знать, как оно работает.

SQL Fiddle

Обновление
Я добавил новое поле QTYReceived_SOHс логикой, чтобы вернуть частичное значение последнего заказа, который завершает текущий SOH:

SELECT 
  items.ItemNumber, orders.ReceivedNumber, orders.QTYReceived,
  CASE 
    WHEN (COALESCE(CSUM_Latest,0) + QTYReceived) > SOH -- Partial order needed for SOH
      THEN (COALESCE(CSUM_Latest,0) + QTYReceived) - SOH -- Diff. of cum. QTYRec and SOH
    ELSE orders.QTYReceived 
  END AS QTYReceived_SOH,
  CSUM_Latest
FROM Items
LEFT JOIN (
  SELECT 
    ItemNumber, 
    ReceivedNumber,
    QTYReceived,
    SUM(QTYReceived) OVER(
      PARTITION BY ItemNumber -- Calculate inventory per item
      ORDER BY ReceivedDate DESC-- Order by most recently received
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING -- Cum. count (exc. current row)
    ) AS CSUM_latest
  FROM Orders
) orders ON orders.ItemNumber = items.ItemNumber -- get order info for each item
WHERE COALESCE(orders.CSUM_latest,0) < items.SOH -- Get enough orders to cover SOH
ORDER BY items.ItemNumber, orders.ReceivedNumber DESC

Попробуйте адаптировать это к вашему запросу и дайте мне знать.

Обновленный SQLFiddle

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