查询帮助:总计父/子项

时间:2011-11-09 19:47:32

标签: sql oracle view sql-scripts

[版。注意:与this SO question相关;没有编辑问题,因为问题已经根本改变,之前的问题/答案仍然有效]

寻找有关如何最好地创建视图的建议。我之前问题的当前查询现在有效,但不考虑父/子项的想法。

相关数据结构

+---------+      +---------+
|WORKORDER|      |WPLABOR  |
|---------|      |---------|
|WONUM    |+---->|WONUM    |
|PARENT   |  +   |LABORHRS |
|ISTASK   |  |   |RATE     |
|...      |  |   +---------+
|         |  |
+---------+  |   +---------+
             |   |WPITEM   |
             |   |---------|
             +-->|WONUM    |
             |   |ITEMQTY  |
             |   |UNITCOST |
             |   +---------+
             |
             |   +----------------+
             |   |LONGDESCRIPTION |
             |   |----------------|
             +-->|LDKEY           |
                 |LDTEXT          |
                 +----------------+

目标

通俗地说,我正在让某人输入工单号,并提取包含工作单信息的报告,以及所有儿童工作人员(也称为任务工作人员)的人工和材料成本摘要

因此,我需要一个返回的视图:

  • 有关该工作单的标准信息(WONUM ID) - 描述,位置等
  • 每个子任务工作人员的总劳动时间(LABORHRS的总和)
  • WPLABOR的总人工成本(LABORHRS * RATE总和)对于每个子任务工作人员
  • 来自WPITEM的项目总成本(ITEMQTY的总和* UNITCOST)对于每个子任务工作人员

子任务工作单是一个工作订单,其中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直接关联),因此人工和项目总数始终为空。

1 个答案:

答案 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';