我尝试了以下查询,该查询将返回每个STOCKCODE的所有行,就像我只有在最早的PurchOrd_Lines.Due Date记录之后一样
SELECT
PURCHORD_LINES.STOCKCODE,
STOCK_ITEMS.DESCRIPTION,
(X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) AS 'FREE STOCK',
X_FREE_STOCK_VW.PhysicalQty AS 'On Hand',
X_FREE_STOCK_VW.CommittedQty AS 'Committed',
X_FREE_STOCK_VW.IncommingQty AS 'Purch_Ord',
PURCHORD_LINES.HDR_SEQNO,
(PURCHORD_LINES.ORD_QUANT-PURCHORD_LINES.SUP_QUANT) AS 'QTY',
CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA',
PURCHORD_HDR.X_PURCHASEORDERREF AS 'Reference'
FROM
PURCHORD_LINES PURCHORD_LINES
JOIN
STOCK_ITEMS ON STOCK_ITEMS.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN
X_FREE_STOCK_VW ON X_FREE_STOCK_VW.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN
PURCHORD_HDR ON PURCHORD_HDR.SEQNO = PURCHORD_LINES.HDR_SEQNO
WHERE
X_FREE_STOCK_VW.LOCATION = 1
AND STOCK_ITEMS.STOCK_CLASSIFICATION IN (0,10,20,200,210,220)
AND STOCK_ITEMS.STOCKCODE NOT LIKE '%2' AND STOCK_ITEMS.STOCKCODE NOT LIKE '%3'
AND (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) <= 0
AND X_FREE_STOCK_VW.CommittedQty > 0
AND LEN(STOCK_ITEMS.STOCKCODE) > 6
AND STOCK_ITEMS.DESCRIPTION IS NOT NULL
AND STOCK_ITEMS.DESCRIPTION != ''
AND STOCK_ITEMS.SUPPLIERNO IN (1009, 1024, 1068, 1115, 1146, 1170, 1259, 1306, 1410, 2768)
AND STOCK_ITEMS.X_BUYER = 'P'
AND ((PURCHORD_LINES.ORD_QUANT - PURCHORD_LINES.SUP_QUANT) > 0 AND
(PURCHORD_LINES.SUP_QUANT/PURCHORD_LINES.ORD_QUANT) < 0.9)
AND ((PURCHORD_HDR.STATUS <> 2)
AND (PURCHORD_HDR.X_DELIVERYSTATUS <> 4)
AND (PURCHORD_LINES.ORD_QUANT > 0))
GROUP BY
PURCHORD_LINES.STOCKCODE, STOCK_ITEMS.DESCRIPTION,
X_FREE_STOCK_VW.PhysicalQty, X_FREE_STOCK_VW.CommittedQty,
X_FREE_STOCK_VW.IncommingQty, PURCHORD_LINES.HDR_SEQNO,
PURCHORD_LINES.ORD_QUANT, PURCHORD_LINES.SUP_QUANT,
PURCHORD_HDR.X_PURCHASEORDERREF
输出为
STOCKCODE| FREE STOCK |On Hand |Committed|Purch_Ord|HDR_SEQNO|QTY|ETA |Reference
42165 | -351 |-29 |322 |406 |106200 |84 |21/02/2020 |426/19
42165 | -351 |-29 |322 |406 |107052 |87 |20/03/2020 |454/19
42165 | -351 |-29 |322 |406 |107626 |150|11/04/2020 |024/20
42166 | -15 |41 |57 |406 |107626 |150|13/02/2020 |074/20
42166 | -15 |41 |57 |406 |107626 |150|17/02/2020 |089/20
鉴于我只需要返回每个股票代码的最早日期(ETA)的行。怎么了?
答案 0 :(得分:1)
您可以使用row_number实现此目的
with data
as ( /*The original query*/
SELECT
PURCHORD_LINES.STOCKCODE,
STOCK_ITEMS.DESCRIPTION,
(X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) AS 'FREE STOCK',
X_FREE_STOCK_VW.PhysicalQty AS 'On Hand',
X_FREE_STOCK_VW.CommittedQty AS 'Committed',
X_FREE_STOCK_VW.IncommingQty AS 'Purch_Ord',
PURCHORD_LINES.HDR_SEQNO,
(PURCHORD_LINES.ORD_QUANT-PURCHORD_LINES.SUP_QUANT) AS 'QTY',
CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA',
PURCHORD_HDR.X_PURCHASEORDERREF AS 'Reference'
FROM PURCHORD_LINES PURCHORD_LINES
JOIN STOCK_ITEMS ON STOCK_ITEMS.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN X_FREE_STOCK_VW ON X_FREE_STOCK_VW.STOCKCODE = PURCHORD_LINES.STOCKCODE
JOIN PURCHORD_HDR ON PURCHORD_HDR.SEQNO = PURCHORD_LINES.HDR_SEQNO
WHERE X_FREE_STOCK_VW.LOCATION = 1
AND STOCK_ITEMS.STOCK_CLASSIFICATION IN (0,10,20,200,210,220)
AND STOCK_ITEMS.STOCKCODE NOT LIKE '%2' AND STOCK_ITEMS.STOCKCODE NOT LIKE '%3'
AND (X_FREE_STOCK_VW.PhysicalQty - X_FREE_STOCK_VW.CommittedQty) <= 0
AND X_FREE_STOCK_VW.CommittedQty > 0
AND LEN(STOCK_ITEMS.STOCKCODE) > 6
AND STOCK_ITEMS.DESCRIPTION IS NOT NULL
AND STOCK_ITEMS.DESCRIPTION != ''
AND STOCK_ITEMS.SUPPLIERNO IN (1009,1024,1068,1115,1146,1170,1259,1306,1410,2768)
AND STOCK_ITEMS.X_BUYER = 'P'
AND ((PURCHORD_LINES.ORD_QUANT - PURCHORD_LINES.SUP_QUANT) > 0 AND (PURCHORD_LINES.SUP_QUANT/PURCHORD_LINES.ORD_QUANT)<0.9)
AND ((PURCHORD_HDR.STATUS<>2)
AND (PURCHORD_HDR.X_DELIVERYSTATUS<>4)
AND (PURCHORD_LINES.ORD_QUANT>0))
GROUP BY PURCHORD_LINES.STOCKCODE
, STOCK_ITEMS.DESCRIPTION
, X_FREE_STOCK_VW.PhysicalQty
, X_FREE_STOCK_VW.CommittedQty
, X_FREE_STOCK_VW.IncommingQty
, PURCHORD_LINES.HDR_SEQNO
, PURCHORD_LINES.ORD_QUANT
, PURCHORD_LINES.SUP_QUANT
, PURCHORD_HDR.X_PURCHASEORDERREF
)
,interim_data
as (
select *,row_number() over(partition by stockcode order by eta asc) as rnk
from data
)
select *
from iterim_data
where rnk=1
答案 1 :(得分:0)
也许这种方式可以帮助您
SELECT ETA, *
FROM (SELECT PURCHORD_LINES.STOCKCODE,
CONVERT(DATETIME, MIN(PURCHORD_LINES.DUEDATE), 103) AS 'ETA'
FROM PURCHORD_LINES PURCHORD_LINES
GROUP BY PURCHORD_LINES.STOCKCODE ) as PURCHORD_ETA
JOIN PURCHORD_LINES ON PURCHORD_LINES.STOCKCODE = PURCHORD_ETA.STOCKCODE
JOIN ...
WHERE ...
GROUP BY ...
尝试子查询,将更容易理解