1

[編。注:このSOの質問に関連しています。問題が根本的に変化し、以前の質問/回答がまだ有効であるため、質問を編集しませんでした]

ビューを作成する最善の方法についてのアドバイスを探しています。以前の問題からの現在のクエリは機能するようになりましたが、親/子アイテムのアイデアは考慮されていません。

関連するデータ構造

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

ゴール

簡単に言えば、私は誰かに作業指示書番号を入力してもらい、作業指示書の情報に加えて、すべての子作業指示書 (タスク作業指示書とも呼ばれます) の人件費と材料費の概要を含むレポートを引き出します。

したがって、次を返すビューが必要です。

  • その作業指示書に関する標準情報 (WONUM によって ID 化) -- 説明、場所など。
  • 子タスク作業指示書ごとの合計労働時間 (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;

現在のクエリの問題

子タスクの作業指示書を考慮しないため、労働やアイテムのレコードは返されず (親に直接関連付けられているものはありません)、労働とアイテムの合計は常に空です。

4

1 に答える 1

0

状況を解決し、「以前の方法で接続する」よりも少し高速なクエリを思いつきました (約 90 秒と比較して 3 秒)。

もう少し簡単にするために、標準の作業指示書情報を別のビューに分けました (いずれにせよ再利用したいと思います)。

私が最終的に得たクエリ(以下)は、トリックを行うようです:

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';
于 2011-11-10T14:50:46.190 に答える