在 SQL 查询中导出最后 PO 价格 (Oracle)
Derive Last PO Price in SQL Query (Oracle)
我正在开发一个脚本,以获取特定时间段(交易日期)内供应商和组织单位的列表项及其各自的最低价、最高价、平均价和最后价格。最后价格以最新成交日为准。
我在根据我开发的脚本计算最后价格时遇到了一些问题。我试着
(1) 添加内部查询以查找项目、组织和供应商的最大交易日期
(2) 根据输出与外部查询进行连接,并连接项目 ID、组织 ID 和供应商 ID。
但是我没有得到预期的结果。
下面是没有内部查询的查询以得出最后的价格。
SELECT NAME INVENTORY_ORG,SEGMENT1 CATEGORY_SEGMENT_1, SEGMENT2 CATEGORY_SEGMENT2, SEGMENT3 CATEGORY_SEGMENT_3,ITEM_DESCRIPTION ARTICLE, TRANSACTION_TYPE TYPE, VENDOR_NAME SUPPLIER,UNIT_OF_MEASURE UNIT,SUM(QUANTITY) QUANTITY_PURCHASED, AVG(PO_UNIT_PRICE) AVERAGE_PRICE, MIN(PO_UNIT_PRICE)MIN_PRICE, MAX(PO_UNIT_PRICE)MAX_PRICE, SUM(QUANTITY) * AVG(PO_UNIT_PRICE) NET_AMOUNT, SUM(VAT_AMOUNT) VAT_AMOUNT,((SUM(QUANTITY) * AVG(PO_UNIT_PRICE)) + SUM(VAT_AMOUNT)) GROSS_AMOUNT
FROM
(SELECT RCV.TRANSACTION_ID, MC.SEGMENT1, MC.SEGMENT2, MC.SEGMENT3,RCV.TRANSACTION_TYPE, RCV.TRANSACTION_DATE, PLA.ITEM_DESCRIPTION,RCV.QUANTITY, RCV.UNIT_OF_MEASURE, RCV.PO_UNIT_PRICE, RCV.ORGANIZATION_ID, HOU.NAME, APS.VENDOR_NAME,
case
WHEN msi.taxable_flag = 'N' then 0
ELSE (nvl(zrb.PERCENTAGE_RATE,0)/100) * PV.Unit_Price*RCV.quantity end as VAT_AMOUNT
FROM
RCV_TRANSACTIONS RCV, PO_LINES_ALL PLA, HR_ORGANIZATION_UNITS HOU, AP_SUPPLIERS APS, PO_LINES_REF_V PV, MTL_SYSTEM_ITEMS MSI,ZX_RATES_B ZRB, MTL_ITEM_CATEGORIES MIC, MTL_CATEGORIES MC
WHERE TRUNC(RCV.TRANSACTION_DATE) >= NVL(:p_transaction_date_from, TRUNC(RCV.TRANSACTION_DATE))
AND TRUNC(RCV.TRANSACTION_DATE) <= NVL(:p_transaction_date_to, TRUNC(RCV.TRANSACTION_DATE))
AND PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION)
AND RCV.ORGANIZATION_ID = NVL(:p_org_id,RCV.ORGANIZATION_ID)
AND APS.VENDOR_NAME = NVL(:p_supplier_name, APS.VENDOR_NAME)
AND RCV.PO_LINE_ID= PV.PO_LINE_ID
AND PLA.PO_LINE_ID(+) = RCV.PO_LINE_ID
AND HOU.ORGANIZATION_ID = RCV.ORGANIZATION_ID
and MSI.INVENTORY_ITEM_ID = PLA.ITEM_ID
and MSI.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID = MIC.INVENTORY_ITEM_ID
AND MIC.CATEGORY_ID = MC.CATEGORY_ID
AND APS.VENDOR_ID(+) = RCV.VENDOR_ID
and ZRB.TAX_RATE_CODE (+)= msi.tax_code
AND RCV.TRANSACTION_TYPE = 'RECEIVE'
AND MIC.CATEGORY_SET_ID = '1')
GROUP BY TRANSACTION_TYPE, ITEM_DESCRIPTION, UNIT_OF_MEASURE, NAME, VENDOR_NAME, SEGMENT1, SEGMENT2, SEGMENT3
ORDER BY INVENTORY_ORG,ITEM_DESCRIPTION,VENDOR_NAME,SEGMENT1, SEGMENT2, SEGMENT3
PO 单价来自 table RCV_Transactions。我们从 PO_Lines_all table.
中获取项目 ID
如果有人可以帮助我,并根据上述查询提供一些有关获取最新价格的最佳方法的提示,我将不胜感激。
可以使用last_value
函数(oracle解析函数)看看如何https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions073.htm
SELECT LAST_VALUE(PO_UNIT_PRICE) over (order by trunc(RCV.TRANSACTION_DATE) ) ...
或者如果您需要分区,您可以这样做
SELECT LAST_VALUE(PO_UNIT_PRICE) over (partition by INVENTORY_ORG order by trunc(RCV.TRANSACTION_DATE) ) ...
使用 LAST_VALUE 解析函数修改脚本
SELECT NAME INVENTORY_ORG,SEGMENT1 CATEGORY_SEGMENT_1, SEGMENT2 CATEGORY_SEGMENT2, SEGMENT3 CATEGORY_SEGMENT_3,ITEM_DESCRIPTION ARTICLE, TRANSACTION_TYPE TYPE, VENDOR_NAME SUPPLIER,UNIT_OF_MEASURE UNIT,SUM(QUANTITY) QUANTITY_PURCHASED, AVG(PO_UNIT_PRICE) AVERAGE_PRICE, MIN(PO_UNIT_PRICE)MIN_PRICE, MAX(PO_UNIT_PRICE)MAX_PRICE, SUM(QUANTITY) * AVG(PO_UNIT_PRICE) NET_AMOUNT, SUM(VAT_AMOUNT) VAT_AMOUNT,((SUM(QUANTITY) * AVG(PO_UNIT_PRICE)) + SUM(VAT_AMOUNT)) GROSS_AMOUNT, LAST_PO_PRICE
FROM
(SELECT
RCV.TRANSACTION_ID,
MC.SEGMENT1,
MC.SEGMENT2,
MC.SEGMENT3,
RCV.TRANSACTION_TYPE,
RCV.TRANSACTION_DATE,
PLA.ITEM_DESCRIPTION,
RCV.QUANTITY,
RCV.UNIT_OF_MEASURE,
RCV.PO_UNIT_PRICE,
RCV.ORGANIZATION_ID,
HOU.NAME,
APS.VENDOR_NAME,
case
WHEN msi.taxable_flag = 'N' then 0
ELSE (nvl(zrb.PERCENTAGE_RATE,0)/100) * PV.Unit_Price*RCV.quantity end as VAT_AMOUNT,
A.LAST_PO_PRICE
FROM
(
SELECT DISTINCT LAST_VALUE(RCV.PO_UNIT_PRICE) over (partition by RCV.ORGANIZATION_ID order by trunc(RCV.TRANSACTION_DATE) ) LAST_PO_PRICE, PLA.ITEM_ID,RCV.ORGANIZATION_ID, RCV.VENDOR_ID
FROM RCV_TRANSACTIONS RCV, PO_LINES_ALL PLA
WHERE PLA.PO_LINE_ID = RCV.PO_LINE_ID
ORDER BY PLA.ITEM_ID
)A,
RCV_TRANSACTIONS RCV,
PO_LINES_ALL PLA,
HR_ORGANIZATION_UNITS HOU,
AP_SUPPLIERS APS,
PO_LINES_REF_V PV,
MTL_SYSTEM_ITEMS MSI,
ZX_RATES_B ZRB,
MTL_ITEM_CATEGORIES MIC,
MTL_CATEGORIES MC
WHERE TRUNC(RCV.TRANSACTION_DATE) >= NVL(:p_transaction_date_from, TRUNC(RCV.TRANSACTION_DATE))
AND TRUNC(RCV.TRANSACTION_DATE) <= NVL(:p_transaction_date_to, TRUNC(RCV.TRANSACTION_DATE))
/* Condition when no item description exist */
--AND (PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION) OR PLA.ITEM_DESCRIPTION IS NULL)
--AND PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION)
AND A.ITEM_ID = PLA.ITEM_ID
AND A.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND A.VENDOR_ID = RCV.VENDOR_ID
AND RCV.ORGANIZATION_ID = NVL(:p_org_id,RCV.ORGANIZATION_ID)
AND APS.VENDOR_NAME = NVL(:p_supplier_name, APS.VENDOR_NAME)
AND RCV.PO_LINE_ID= PV.PO_LINE_ID
AND PLA.PO_LINE_ID(+) = RCV.PO_LINE_ID
AND HOU.ORGANIZATION_ID = RCV.ORGANIZATION_ID
and MSI.INVENTORY_ITEM_ID = PLA.ITEM_ID
and MSI.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID = MIC.INVENTORY_ITEM_ID
AND MIC.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MIC.CATEGORY_ID = MC.CATEGORY_ID
AND APS.VENDOR_ID(+) = RCV.VENDOR_ID
and ZRB.TAX_RATE_CODE (+)= msi.tax_code
AND RCV.TRANSACTION_TYPE = 'RECEIVE'
AND MIC.CATEGORY_SET_ID = '1')
GROUP BY TRANSACTION_TYPE, ITEM_DESCRIPTION, UNIT_OF_MEASURE, NAME, VENDOR_NAME, SEGMENT1, SEGMENT2, SEGMENT3, PO_UNIT_PRICE, TRANSACTION_DATE, LAST_PO_PRICE
ORDER BY INVENTORY_ORG,ITEM_DESCRIPTION,VENDOR_NAME,SEGMENT1, SEGMENT2, SEGMENT3
我正在开发一个脚本,以获取特定时间段(交易日期)内供应商和组织单位的列表项及其各自的最低价、最高价、平均价和最后价格。最后价格以最新成交日为准。
我在根据我开发的脚本计算最后价格时遇到了一些问题。我试着
(1) 添加内部查询以查找项目、组织和供应商的最大交易日期
(2) 根据输出与外部查询进行连接,并连接项目 ID、组织 ID 和供应商 ID。
但是我没有得到预期的结果。
下面是没有内部查询的查询以得出最后的价格。
SELECT NAME INVENTORY_ORG,SEGMENT1 CATEGORY_SEGMENT_1, SEGMENT2 CATEGORY_SEGMENT2, SEGMENT3 CATEGORY_SEGMENT_3,ITEM_DESCRIPTION ARTICLE, TRANSACTION_TYPE TYPE, VENDOR_NAME SUPPLIER,UNIT_OF_MEASURE UNIT,SUM(QUANTITY) QUANTITY_PURCHASED, AVG(PO_UNIT_PRICE) AVERAGE_PRICE, MIN(PO_UNIT_PRICE)MIN_PRICE, MAX(PO_UNIT_PRICE)MAX_PRICE, SUM(QUANTITY) * AVG(PO_UNIT_PRICE) NET_AMOUNT, SUM(VAT_AMOUNT) VAT_AMOUNT,((SUM(QUANTITY) * AVG(PO_UNIT_PRICE)) + SUM(VAT_AMOUNT)) GROSS_AMOUNT
FROM
(SELECT RCV.TRANSACTION_ID, MC.SEGMENT1, MC.SEGMENT2, MC.SEGMENT3,RCV.TRANSACTION_TYPE, RCV.TRANSACTION_DATE, PLA.ITEM_DESCRIPTION,RCV.QUANTITY, RCV.UNIT_OF_MEASURE, RCV.PO_UNIT_PRICE, RCV.ORGANIZATION_ID, HOU.NAME, APS.VENDOR_NAME,
case
WHEN msi.taxable_flag = 'N' then 0
ELSE (nvl(zrb.PERCENTAGE_RATE,0)/100) * PV.Unit_Price*RCV.quantity end as VAT_AMOUNT
FROM
RCV_TRANSACTIONS RCV, PO_LINES_ALL PLA, HR_ORGANIZATION_UNITS HOU, AP_SUPPLIERS APS, PO_LINES_REF_V PV, MTL_SYSTEM_ITEMS MSI,ZX_RATES_B ZRB, MTL_ITEM_CATEGORIES MIC, MTL_CATEGORIES MC
WHERE TRUNC(RCV.TRANSACTION_DATE) >= NVL(:p_transaction_date_from, TRUNC(RCV.TRANSACTION_DATE))
AND TRUNC(RCV.TRANSACTION_DATE) <= NVL(:p_transaction_date_to, TRUNC(RCV.TRANSACTION_DATE))
AND PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION)
AND RCV.ORGANIZATION_ID = NVL(:p_org_id,RCV.ORGANIZATION_ID)
AND APS.VENDOR_NAME = NVL(:p_supplier_name, APS.VENDOR_NAME)
AND RCV.PO_LINE_ID= PV.PO_LINE_ID
AND PLA.PO_LINE_ID(+) = RCV.PO_LINE_ID
AND HOU.ORGANIZATION_ID = RCV.ORGANIZATION_ID
and MSI.INVENTORY_ITEM_ID = PLA.ITEM_ID
and MSI.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID = MIC.INVENTORY_ITEM_ID
AND MIC.CATEGORY_ID = MC.CATEGORY_ID
AND APS.VENDOR_ID(+) = RCV.VENDOR_ID
and ZRB.TAX_RATE_CODE (+)= msi.tax_code
AND RCV.TRANSACTION_TYPE = 'RECEIVE'
AND MIC.CATEGORY_SET_ID = '1')
GROUP BY TRANSACTION_TYPE, ITEM_DESCRIPTION, UNIT_OF_MEASURE, NAME, VENDOR_NAME, SEGMENT1, SEGMENT2, SEGMENT3
ORDER BY INVENTORY_ORG,ITEM_DESCRIPTION,VENDOR_NAME,SEGMENT1, SEGMENT2, SEGMENT3
PO 单价来自 table RCV_Transactions。我们从 PO_Lines_all table.
中获取项目 ID如果有人可以帮助我,并根据上述查询提供一些有关获取最新价格的最佳方法的提示,我将不胜感激。
可以使用last_value
函数(oracle解析函数)看看如何https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions073.htm
SELECT LAST_VALUE(PO_UNIT_PRICE) over (order by trunc(RCV.TRANSACTION_DATE) ) ...
或者如果您需要分区,您可以这样做
SELECT LAST_VALUE(PO_UNIT_PRICE) over (partition by INVENTORY_ORG order by trunc(RCV.TRANSACTION_DATE) ) ...
使用 LAST_VALUE 解析函数修改脚本
SELECT NAME INVENTORY_ORG,SEGMENT1 CATEGORY_SEGMENT_1, SEGMENT2 CATEGORY_SEGMENT2, SEGMENT3 CATEGORY_SEGMENT_3,ITEM_DESCRIPTION ARTICLE, TRANSACTION_TYPE TYPE, VENDOR_NAME SUPPLIER,UNIT_OF_MEASURE UNIT,SUM(QUANTITY) QUANTITY_PURCHASED, AVG(PO_UNIT_PRICE) AVERAGE_PRICE, MIN(PO_UNIT_PRICE)MIN_PRICE, MAX(PO_UNIT_PRICE)MAX_PRICE, SUM(QUANTITY) * AVG(PO_UNIT_PRICE) NET_AMOUNT, SUM(VAT_AMOUNT) VAT_AMOUNT,((SUM(QUANTITY) * AVG(PO_UNIT_PRICE)) + SUM(VAT_AMOUNT)) GROSS_AMOUNT, LAST_PO_PRICE
FROM
(SELECT
RCV.TRANSACTION_ID,
MC.SEGMENT1,
MC.SEGMENT2,
MC.SEGMENT3,
RCV.TRANSACTION_TYPE,
RCV.TRANSACTION_DATE,
PLA.ITEM_DESCRIPTION,
RCV.QUANTITY,
RCV.UNIT_OF_MEASURE,
RCV.PO_UNIT_PRICE,
RCV.ORGANIZATION_ID,
HOU.NAME,
APS.VENDOR_NAME,
case
WHEN msi.taxable_flag = 'N' then 0
ELSE (nvl(zrb.PERCENTAGE_RATE,0)/100) * PV.Unit_Price*RCV.quantity end as VAT_AMOUNT,
A.LAST_PO_PRICE
FROM
(
SELECT DISTINCT LAST_VALUE(RCV.PO_UNIT_PRICE) over (partition by RCV.ORGANIZATION_ID order by trunc(RCV.TRANSACTION_DATE) ) LAST_PO_PRICE, PLA.ITEM_ID,RCV.ORGANIZATION_ID, RCV.VENDOR_ID
FROM RCV_TRANSACTIONS RCV, PO_LINES_ALL PLA
WHERE PLA.PO_LINE_ID = RCV.PO_LINE_ID
ORDER BY PLA.ITEM_ID
)A,
RCV_TRANSACTIONS RCV,
PO_LINES_ALL PLA,
HR_ORGANIZATION_UNITS HOU,
AP_SUPPLIERS APS,
PO_LINES_REF_V PV,
MTL_SYSTEM_ITEMS MSI,
ZX_RATES_B ZRB,
MTL_ITEM_CATEGORIES MIC,
MTL_CATEGORIES MC
WHERE TRUNC(RCV.TRANSACTION_DATE) >= NVL(:p_transaction_date_from, TRUNC(RCV.TRANSACTION_DATE))
AND TRUNC(RCV.TRANSACTION_DATE) <= NVL(:p_transaction_date_to, TRUNC(RCV.TRANSACTION_DATE))
/* Condition when no item description exist */
--AND (PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION) OR PLA.ITEM_DESCRIPTION IS NULL)
--AND PLA.ITEM_DESCRIPTION = NVL(:p_item_description, PLA.ITEM_DESCRIPTION)
AND A.ITEM_ID = PLA.ITEM_ID
AND A.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND A.VENDOR_ID = RCV.VENDOR_ID
AND RCV.ORGANIZATION_ID = NVL(:p_org_id,RCV.ORGANIZATION_ID)
AND APS.VENDOR_NAME = NVL(:p_supplier_name, APS.VENDOR_NAME)
AND RCV.PO_LINE_ID= PV.PO_LINE_ID
AND PLA.PO_LINE_ID(+) = RCV.PO_LINE_ID
AND HOU.ORGANIZATION_ID = RCV.ORGANIZATION_ID
and MSI.INVENTORY_ITEM_ID = PLA.ITEM_ID
and MSI.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MSI.INVENTORY_ITEM_ID = MIC.INVENTORY_ITEM_ID
AND MIC.ORGANIZATION_ID = RCV.ORGANIZATION_ID
AND MIC.CATEGORY_ID = MC.CATEGORY_ID
AND APS.VENDOR_ID(+) = RCV.VENDOR_ID
and ZRB.TAX_RATE_CODE (+)= msi.tax_code
AND RCV.TRANSACTION_TYPE = 'RECEIVE'
AND MIC.CATEGORY_SET_ID = '1')
GROUP BY TRANSACTION_TYPE, ITEM_DESCRIPTION, UNIT_OF_MEASURE, NAME, VENDOR_NAME, SEGMENT1, SEGMENT2, SEGMENT3, PO_UNIT_PRICE, TRANSACTION_DATE, LAST_PO_PRICE
ORDER BY INVENTORY_ORG,ITEM_DESCRIPTION,VENDOR_NAME,SEGMENT1, SEGMENT2, SEGMENT3