Oracle SQL: ROLLUP неправильно суммируется - PullRequest
1 голос
/ 30 марта 2010

Свертывание, кажется, работает правильно, чтобы посчитать количество единиц, но не количество поездов. Есть идеи, что может быть причиной этого?

Вывод запроса выглядит следующим образом. Сумма столбца «Единицы» в желтом цвете равна 53, но в сводном показе отображается 51. Хотя количество единиц складывается корректно ...

альтернативный текст http://img522.imageshack.us/img522/9057/ss20100330111503.png

А вот и SQL-запрос оракула ...

 select t.year,
    t.week,
    decode(t.mine_id,NULL,'PF',t.mine_id) as mine_id,
    decode(t.product,Null,'LF',t.product) as product,
    decode(t.mine_id||'-'||t.product,'-','PF',t.mine_id||'-'||t.product) as code,
    count(distinct t.tpps_train_id) as trains,
    count(1) as units

from 

 (
     select trn.mine_code as mine_id,
            trn.train_tpps_id as tpps_train_id,      
            round((con.calibrated_weight_total - con.empty_weight_total),2) as tonnes 
     from  widsys.train trn
               INNER JOIN widsys.consist con
                   USING (train_record_id)

     where trn.direction = 'N'
           and (con.calibrated_weight_total-con.empty_weight_total) > 10
           and trn.num_cars > 10 
   and con.consist_no not like '_L%'
    ) w,

     (
      select to_char(td.datetime_act_comp_dump-7/24, 'IYYY') as year,
             to_char(td.datetime_act_comp_dump-7/24, 'IW') as week,
             td.mine_code as mine_id,
             td.train_id as tpps_train_id,
             pt.product_type_code as product
      from tpps.train_details td
           inner join tpps.ore_products op
           using (ore_product_key)
           inner join tpps.product_types pt
           using (product_type_key)
      where to_char(td.datetime_act_comp_dump-7/24, 'IYYY') = 2010
            and to_char(td.datetime_act_comp_dump-7/24, 'IW') = 12
      order by td.datetime_act_comp_dump asc
 ) t 
where w.mine_id = t.mine_id
   and w.tpps_train_id = t.tpps_train_id

  having t.product is not null or t.mine_id is null 
    group by 
           t.year,
          t.week,  
         rollup(
          t.mine_id,
          t.product)

1 Ответ

3 голосов
/ 30 марта 2010

Я думаю, что это ОТЛИЧИЕ. Вы получаете общее количество значений DISTINCT, а не сумму количества различных значений для каждой записи.

select nvl(owner,'-') owner, count(distinct object_type) c1, count(*) c2
from all_objects
where owner in ('MDSYS','CTXSYS')
group by rollup(owner)

дает

OWNER     C1    C2
CTXSYS     6    82
MDSYS     11   653
-         11   735
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...