У меня есть две таблицы:
Таблица 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