22,209
社区成员
发帖
与我相关
我的任务
分享
declare @poline table(ponum int,PartNum VARCHAR(100),Qty INT ,[Date] datetime,[DESC] nvarchar(50),Salesid VARCHAR(100));
insert into @poline values
('32001' ,'X222-1',200,'2017/1/3',N'产品1','S01')
,('32001' ,'PPPP-1',300,'2017/1/3',N'产品2','S01')
,('32002' ,'X222-1',500,'2017/1/6',N'产品1','S02')
declare @vendor table(ponum int,PartNum VARCHAR(100),[DESC] nvarchar(50),VenQty INT ,VenDate datetime,Venid VARCHAR(100));
insert into @vendor values
('32001' ,'X222-1',N'产品1',100,'2017/1/7','V01')
,('32001' ,'X222-1',N'产品1',50,'2017/1/8','V01')
,('32001' ,'X222-1',N'产品1',50,'2017/1/8','V01')
,('32001' ,'PPPP-1',N'产品2',300,'2017/1/8','V02')
select *,PARSENAME(vv.newest,1) AS VenQty,PARSENAME(vv.newest,2) AS VenDate FROM @poline AS p
LEFT JOIN (
SELECT v.ponum,v.PartNum, MAX(CONVERT(VARCHAR,v.VenDate,111)+'.'+LTRIM(v.VenQty)) AS newest
FROM @vendor AS v GROUP BY v.ponum,v.PartNum
) AS vv ON vv.ponum=p.ponum AND vv.PartNum=p.PartNum
ponum PartNum Qty Date DESC Salesid ponum PartNum newest VenQty VenDate
32001 X222-1 200 2017-01-03 00:00:00.000 产品1 S01 32001 X222-1 2017/01/08.50 50 2017/01/08
32001 PPPP-1 300 2017-01-03 00:00:00.000 产品2 S01 32001 PPPP-1 2017/01/08.300 300 2017/01/08
32002 X222-1 500 2017-01-06 00:00:00.000 产品1 S02 NULL NULL NULL NULL NULL
SELECT p.PoNum, p.PartNum, p.Qty, p.Date, p.DEC,
v.VenQty, v.VenDate
FROM poline p
LEFT JOIN (
SELECT PoNum, PartNum,
MAX(ID) AS MAX_ID
FROM vendor
GROUP BY PoNum, PartNum
) vg
ON p.PoNum = vg.PoNum
AND p.PartNum = vg.PartNum
LEFT JOIN vendor v
ON vg.MAX_ID = v.ID
/* 筛选
WHERE p.PoNum = 32001
AND p.PartNum = 'PPPP-1'
*/
/* 测试数据
WITH poline(PoNum,PartNum,Qty,Date,DEC) AS (
SELECT 32001,'X222-1',200,'2017-01-03','产品1' UNION ALL
SELECT 32001,'PPPP-1',300,'2017-01-03','产品2' UNION ALL
SELECT 32002,'X222-1',500,'2017-01-06','产品1'
),
vendor(PoNum,PartNum,VenQty,VenDate) AS (
SELECT 32001,'X222-1',100,'2017-01-07' UNION ALL
SELECT 32001,'X222-1', 50,'2017-01-08' UNION ALL
SELECT 32001,'X222-1', 50,'2017-01-08' UNION ALL
SELECT 32001,'PPPP-1',300,'2017-01-08'
)
*/
SELECT p.PoNum, p.PartNum, p.Qty, p.Date, p.DEC,
v.*
FROM poline p
OUTER APPLY (
SELECT TOP 1 VenQty, VenDate
FROM vendor
WHERE PoNum = p.PoNum
AND PartNum = p.PartNum
ORDER BY VenDate DESC
) v
/* 筛选
WHERE p.PoNum = 32001
AND p.PartNum = 'PPPP-1'
*/
PoNum PartNum Qty Date DEC VenQty VenDate
----------- ------- ----------- ---------- ----- ----------- ----------
32001 X222-1 200 2017-01-03 产品1 50 2017-01-08
32001 PPPP-1 300 2017-01-03 产品2 300 2017-01-08
32002 X222-1 500 2017-01-06 产品1 NULL NULL
PoNum PartNum Qty Date DEC VenQty VenDate
----------- ------- ----------- ---------- ----- ----------- ----------
32001 PPPP-1 300 2017-01-03 产品2 300 2017-01-08