[版。注意:与this SO question相关;没有编辑问题,因为问题已经根本改变,之前的问题/答案仍然有效]
寻找有关如何最好地创建视图的建议。我之前问题的当前查询现在有效,但不考虑父/子项的想法。
+---------+ +---------+
|WORKORDER| |WPLABOR |
|---------| |---------|
|WONUM |+---->|WONUM |
|PARENT | + |LABORHRS |
|ISTASK | | |RATE |
|... | | +---------+
| | |
+---------+ | +---------+
| |WPITEM |
| |---------|
+-->|WONUM |
| |ITEMQTY |
| |UNITCOST |
| +---------+
|
| +----------------+
| |LONGDESCRIPTION |
| |----------------|
+-->|LDKEY |
|LDTEXT |
+----------------+
通俗地说,我正在让某人输入工单号,并提取包含工作单信息的报告,以及所有儿童工作人员(也称为任务工作人员)的人工和材料成本摘要
因此,我需要一个返回的视图:
子任务工作单是一个工作订单,其中parent =第一个工作订单的WONUM,ISTASK = 1
我希望能够通过以下方式调用此方法:
SELECT * from [ViewName] where wonum = '123abc';
我知道这涉及子查询和联接的组合,我只是不确定构建关系的最佳方法是什么。
SELECT WORKORDER.WONUM ,
WORKORDER.ACTLABHRS ,
WORKORDER.LOCATION ,
WORKORDER.STATUS ,
WORKORDER.WO7 , -- Requester
WORKORDER.WO8 , -- Extension
WORKORDER.WO9 , -- Location
WORKORDER.LEADCRAFT ,
WORKORDER.WO11 , -- Extension
WORKORDER.GLACCOUNT ,
WORKORDER.WO10 , -- Contact
WORKORDER.DESCRIPTION, -- Short description
WORKORDER.WO6 , -- Plant rearrangement (YORN / boolean value)
WORKORDER.ISTASK ,
WORKORDER.PARENT ,
LABOR.TOTALLABORHRS ,
LABOR.LABORCOST ,
ITEM.ITEMCOST ,
DESCRIPTION.LDTEXT
FROM MAXIMO.WORKORDER
LEFT JOIN
( SELECT WPLABOR.WONUM ,
SUM(WPLABOR.LABORHRS * WPLABOR.RATE) AS LABORCOST ,
SUM(WPLABOR.LABORHRS) AS TOTALLABORHRS
FROM MAXIMO.WPLABOR
GROUP BY WONUM
)
LABOR
ON WORKORDER.WONUM = LABOR.WONUM
LEFT JOIN
( SELECT WPITEM.WONUM ,
SUM(WPITEM.ITEMQTY * WPITEM.UNITCOST) AS ITEMCOST
FROM MAXIMO.WPITEM
GROUP BY WONUM
)
ITEM
ON WORKORDER.WONUM = ITEM.WONUM
LEFT JOIN
( SELECT LONGDESCRIPTION.LDKEY,
LONGDESCRIPTION.LDTEXT
FROM MAXIMO.LONGDESCRIPTION
WHERE LONGDESCRIPTION.LDOWNERTABLE='WORKORDER'
AND LONGDESCRIPTION.LDOWNERCOL = 'DESCRIPTION'
)
DESCRIPTION
ON WORKORDER.WONUM = CAST(DESCRIPTION.LDKEY AS VARCHAR(22)) HERE WORKORDER.ISTASK = 1;
因为它不考虑子任务工作程序,所以它不会返回任何人工或项目记录(没有与parrent直接关联),因此人工和项目总数始终为空。
答案 0 :(得分:0)
我提出了一个解决问题的查询,比“先通过连接”方法快了一点(3秒钟,相比之下大约90秒)。
为了使它更容易一些,我将标准的工作订单信息分成了一个单独的视图(无论如何我想重新使用它)。
我最终得到的查询(下面)似乎可以解决问题:
CREATE OR replace VIEW r_wo_costsummariesbyparent
AS
SELECT workorder.parent,
Nvl(SUM(wosummary.totallaborhoursforwo), 0) AS totallaborhoursforparent,
Nvl(SUM(wosummary.totallaborcostforwo), 0) AS totallaborcostforparent,
Nvl(SUM(wosummary.totalitemcostforwo), 0) AS totalitemcostforparent
FROM maximo.workorder
inner join (SELECT workorder.wonum,
Nvl(SUM(wplabor.laborhrs), 0) AS totallaborhoursforwo,
Nvl(SUM(wplabor.laborhrs * wplabor.rate), 0) AS totallaborcostforwo,
Nvl(SUM(wpitem.itemqty * wpitem.unitcost), 0) AS totalitemcostforwo
FROM maximo.workorder
inner join maximo.wplabor
ON ( workorder.wonum = wplabor.wonum )
inner join maximo.wpitem
ON ( workorder.wonum = wpitem.wonum )
WHERE workorder.istask = 1
GROUP BY workorder.wonum) wosummary
ON workorder.wonum = wosummary.wonum
GROUP BY workorder.parent;
我以下列方式使用它:
Select * from r_wo_costsummariesbyparent where parent = '123abc';