[编。注意:与此 SO 问题相关;没有编辑问题,因为问题已经从根本上发生了变化,并且之前的问题/答案仍然有效]
寻找有关如何最好地创建视图的建议。我之前的问题中的当前查询现在可以工作,但没有考虑到父/子项目的想法。
相关数据结构
+---------+ +---------+
|WORKORDER| |WPLABOR |
|---------| |---------|
|WONUM |+---->|WONUM |
|PARENT | + |LABORHRS |
|ISTASK | | |RATE |
|... | | +---------+
| | |
+---------+ | +---------+
| |WPITEM |
| |---------|
+-->|WONUM |
| |ITEMQTY |
| |UNITCOST |
| +---------+
|
| +----------------+
| |LONGDESCRIPTION |
| |----------------|
+-->|LDKEY |
|LDTEXT |
+----------------+
目标
用外行的话来说,我让某人输入一个工单编号,然后提取一份包含工单信息的报告,以及所有子工单(也称为任务工单)的人工和材料成本摘要
因此,我需要一个返回的视图:
- 有关该工作订单的标准信息(由 WONUM 标识)——描述、位置等。
- 每个子任务工单的总工时 (SUM of LABORHRS)
- 来自 WPLABOR 的每个子任务工单的总人工成本(LABORHRS*RATE 的总和)
- 来自 WPITEM 的总项目成本(ITEMQTY*UNITCOST 的总和)对于它的每个子任务工单
子任务工单是一个工单,其中父级 = 第一个工单的 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;
当前查询的问题
因为它不考虑子任务工单,所以它不返回任何人工或项目记录(没有与父级直接关联),因此人工和项目总计始终为空。