2017-08-11 97 views
0
SELECT 

worksorders.id AS 'Works Order No', 
worksorders.partid AS 'Part No', 
allpartmaster.partdesc AS 'Description', 
worksorders.quantity AS 'Qty', 
wip.wqleft AS 'Qty Rem', 
worksorders.duedate AS 'Due Date', 
worksorders.lateststartdate AS 'Latest Start Date', 
worksorders.kitstatus AS 'Kit Status', 
wip.wopnumber AS 'Op No', 
wip.wmachine AS 'Work Centre', 
wip.wdesc AS 'WC Description', 
wip.wstate as 'Op State', 
(SELECT wstate FROM wip WHERE wip.wona = worksorders.id and wip.wopnumber = (wip.wopnumber - 10)) as 'Prev Op State' 

FROM efacdb.dbo.allpartmaster allpartmaster, efacdb.dbo.wip wip, efacdb.dbo.worksorders worksorders 

WHERE worksorders.id = wip.wona AND allpartmaster.partnum = worksorders.partid AND ((worksorders.status = 'ACTIVE') AND (wip.wstate = 'NS')) 

AND wip.wmachine = 'POLISH' 

ORDER BY worksorders.lateststartdate ASC 

我在查询时遇到问题,我不确定它是否有可能。我正在返回按10步骤编号的操作,我需要返回以前操作的状态。这里的重点线:SQL子查询其中列=列-10

(SELECT wstate FROM wip WHERE wip.wona = worksorders.id and wip.wopnumber = (wip.wopnumber - 10)) as 'Prev Op State' 

我想借此从父SELECT查询wopnumber,取10关闭并返回该行的wstate列。

这可能吗?

+1

测试,我认为样本数据和预期的结果将真正帮助解释你想要做什么。 –

+4

您应该在子查询中使用不同的别名,以便您可以引用外部表。您还应该使用ANSI连接 - 自1992年以来,它们一直处于SQL标准之中,是*世纪*之前的四分之一。 –

+0

@Damien_The_Unbeliever旧学校加入显然有一定的怀旧情绪,有点像聆听经典摇滚:-) –

回答

0

也许这就是你想要的?

SELECT 

     worksorders.id AS 'Works Order No', 
     worksorders.partid AS 'Part No', 
     allpartmaster.partdesc AS 'Description', 
     worksorders.quantity AS 'Qty', 
     wip.wqleft AS 'Qty Rem', 
     worksorders.duedate AS 'Due Date', 
     worksorders.lateststartdate AS 'Latest Start Date', 
     worksorders.kitstatus AS 'Kit Status', 
     wip.wopnumber AS 'Op No', 
     wip.wmachine AS 'Work Centre', 
     wip.wdesc AS 'WC Description', 
     wip.wstate as 'Op State', 
     app.wstate as 'Prev Op State' 

FROM efacdb.dbo.allpartmaster allpartmaster, efacdb.dbo.wip wip, efacdb.dbo.worksorders worksorders 
    cross apply (SELECT wstate 
        FROM wip wip1 
        WHERE wip1.wona = worksorders.id and wip1.wopnumber = wip.wopnumber - 10) app 

WHERE worksorders.id = wip.wona AND allpartmaster.partnum = worksorders.partid AND ((worksorders.status = 'ACTIVE') AND (wip.wstate = 'NS')) 

AND wip.wmachine = 'POLISH' 

ORDER BY worksorders.lateststartdate ASC 
0

也许是这样的?

SELECT 
worksorders.id AS [Works Order No], 
worksorders.partid AS [Part No], 
allpartmaster.partdesc AS [Description], 
worksorders.quantity AS [Qty], 
wip.wqleft AS [Qty Rem], 
worksorders.duedate AS [Due Date], 
worksorders.lateststartdate AS [Latest Start Date], 
worksorders.kitstatus AS [Kit Status], 
wip.wopnumber AS [Op No], 
wip.wmachine AS [Work Centre], 
wip.wdesc AS [WC Description], 
wip.wstate as [Op State], 
prevwip.wstate as [Prev Op State] 
FROM efacdb.dbo.allpartmaster allpartmaster 
JOIN efacdb.dbo.wip wip ON (allpartmaster.partnum = worksorders.partid AND wip.wstate = 'NS' AND wip.wmachine = 'POLISH') 
JOIN efacdb.dbo.worksorders worksorders ON (worksorders.id = wip.wona and worksorders.status = 'ACTIVE') 
LEFT JOIN efacdb.dbo.wip prevwip ON (prevwip.wona = wip.wona and prevwip.wopnumber = (wip.wopnumber - 10)) 
ORDER BY worksorders.lateststartdate ASC 

免责声明:只有在记事本