Справка по запросу: Суммирование родительских / дочерних элементов - PullRequest
1 голос
/ 09 ноября 2011

[ Ed. Примечание: относится к этому вопросу SO ; не редактировал вопрос, потому что проблема в корне изменилась, а вопрос / ответы по-прежнему актуальны ]

Нужен совет, как лучше всего создать вид. Текущий запрос из моей предыдущей задачи теперь работает, но не учитывает идею родительских / дочерних элементов.

Соответствующая структура данных

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

Цель

С точки зрения непрофессионала, мне нужно, чтобы кто-то ввел номер рабочего задания и вытащил отчет, содержащий информацию о рабочем заказе, а также сводную информацию о трудозатратах и ​​расходах на материалы для всех детских рабочих заказов (также называемых рабочими заданиями)

Поэтому мне нужно представление, которое возвращает:

  • Стандартная информация об этом заказе (ID'd от WONUM) - описание, местоположение и т. Д.
  • Общее количество рабочих часов (SUM of LABORHRS) для каждого из дочерних рабочих заданий
  • Общая стоимость рабочей силы (сумма LABORHRS * RATE) от WPLABOR Для каждого из его дочерних рабочих заказов
  • Общая стоимость товара (СУММА ПУНКТА * UNITCOST) от WPITEM Для каждого из его дочерних рабочих заказов

A Child Workororder - это рабочий порядок, где 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;

Проблемы с текущим запросом

Поскольку он не учитывает дочерние рабочие задания, он не возвращает никаких записей о работах или элементах (ни одна из них не связана напрямую с родителем), поэтому итоги работ и элементов всегда пусты.

1 Ответ

0 голосов
/ 10 ноября 2011

Я пришел с запросом, который разрешает ситуацию и работает немного быстрее, чем метод «подключиться ранее» (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';
...