Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Просуммировать столбцы по критерию  [new]
goodler
Member

Откуда:
Сообщений: 6
Здравствуйте, опять вопрос по сумме столбца, есть вот такой запрос:
select      

        v.heat_id,     
        v.PIECE_NUM_ID,     
     
         SUBSTR (LTRIM (V.PIECE_ID, 0), 8, 2) as nomer_rulona,     

        V.INTERNAL_STEEL_GRADE_ID,     
     
       Round(V.ACTUAL_WEIGHT/1000,2) as coil_weight,     

        CASE     
     
             WHEN NVL (ATTD.ATT, 0) > 0     
     
             THEN     
     
                CASE WHEN NVL (ATTD_A.ATT, 0) = 0 THEN 100 ELSE 0 END     
     
             ELSE 100        
     
        END             AS ATT_ITOG_PROC,     
     
        to_char (v.PRODUCTION_DATETIME,'dd.mm.yyyy') AS PRODUCTION_DATETIME ,      
     
        SUBSTR (LTRIM (V1.PIECE_ID, 0), 8, 7) as nomer_shtripsa,     
  v1.PIECE_NUM_ID as  PIECE_NUM_ID_Strips,   

        V1.INTERNAL_STEEL_GRADE_ID as grade_shtripsa,     

  to_char (v1.PRODUCTION_DATETIME,'dd.mm.yyyy') AS PRODUCTION_DATETIME_Strips,      
     
       Round(V1.ACTUAL_WEIGHT/1000,2) as SHTRIPS_WEIGHT,  
             
        CASE     
     
             WHEN NVL (ATTD1.ATT, 0) > 0     
     
             THEN     
     
                CASE WHEN NVL (ATTD_A1.ATT, 0) = 0 THEN 100 ELSE 0 END     
     
             ELSE 100        
     
        END             AS ATT_ITOG_PROC_STRIPS     
       

from v_piece v     
     
    left join piece_relationship pr on pr.parent_piece_num_id = v.piece_num_id     
  AND pr.child_piece_num_id IN(SELECT v1.piece_num_id FROM V_PIECE V1 WHERE v1.product_type = 'HRC-CE'   AND V1.IS_COMPOSITE_FLAG = 'N' )    
     join v_piece v1 on v1.piece_num_id = pr.child_piece_num_id      
     
                            AND v1.product_type = 'HRC-CE'      
     
                            AND V1.IS_COMPOSITE_FLAG = 'N'     
 LEFT JOIN piece_relationship pr1 ON pr1.child_piece_num_id = v.piece_num_id     

    LEFT JOIN SALES_ORDER_HEADER SOH on SOH.SO_ID = V1.SO_ID                             
    LEFT JOIN SALES_ORDER_LINE SOL on SOL.SO_ID = V.SO_ID       

     
    LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                        FROM STY_PIECE_DEFECT     
     
                        WHERE ACTIVE_FLAG = 'Y'     
     
                        GROUP BY PIECE_NUM_ID) ATTD_A  ON V.PIECE_NUM_ID = ATTD_A.PIECE_NUM_ID     
     
  LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                      FROM STY_PIECE_DEFECT     
     
                      GROUP BY PIECE_NUM_ID) ATTD  ON V.PIECE_NUM_ID = ATTD.PIECE_NUM_ID                             
     
    LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                        FROM STY_PIECE_DEFECT     
     
                        WHERE ACTIVE_FLAG = 'Y'     
     
                        GROUP BY PIECE_NUM_ID) ATTD_A1  ON V1.PIECE_NUM_ID = ATTD_A1.PIECE_NUM_ID     
     
  LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                      FROM STY_PIECE_DEFECT     
     
                      GROUP BY PIECE_NUM_ID) ATTD1  ON V1.PIECE_NUM_ID = ATTD1.PIECE_NUM_ID       
                          

     
 where v.PRODUCTION_DATETIME BETWEEN TRUNC (:START_DATE)    AND TRUNC (:STOP_DATE) +1    
        AND v.product_type = 'HRC'  
        and v.heat_id='1314563'


он возвращает вот такую таблицу:
HEAT_IDPIECE_NUM_IDNOMER_RULONAINTERNAL_STEEL_GRADE_IDCOIL_WEIGHTATT_ITOG_PROCPRODUCTION_DATETIMENOMER_SHTRIPSAPIECE_NUM_ID_STRIPSGRADE_SHTRIPSAPRODUCTION_DATETIME_STRIPSSHTRIPS_WEIGHTATT_ITOG_PROC_STRIPS
131456318583650113HFA-1034,9110001.09.20130101-02186073713HFA-1019.09.201310,96100
131456318583650113HFA-1034,9110001.09.20130102-01186073913HFA-1019.09.20135,810
131456318583650113HFA-1034,9110001.09.20130101-01186073613HFA-1019.09.201310,96100
131456318583650113HFA-1034,9110001.09.20130102-02186074013HFA-1019.09.20135,810
131456318583680213HFA-1035,4410001.09.20130202186071213HFA-1019.09.201317,17100
131456318583680213HFA-1035,4410001.09.20130201186071113HFA-1019.09.201317,17100
131456318583720313HFA-103510001.09.20130301186076013HFA-1019.09.201317,04100
131456318583720313HFA-103510001.09.20130302186076113HFA-1019.09.201317,04100
131456318583750413HFA-1035,3710001.09.20130402186076913HFA-1019.09.201317,03100
131456318583750413HFA-1035,3710001.09.20130401186076813HFA-1019.09.201317,03100


мне нужно изменить запрос, так чтобы, получить суммарное значение столбца COIL_WEIGHT, причем, суммироваться должны не повторяющиеся рулоны, т.е. 34,91+35,44+35+35,37

и получить суммарное значение столбца SHTRIPS_WEIGHT, причем, суммироваться должны только те штрипсы у которых поле ATT_ITOG_PROC_STRIPS равно 100
т.е получить вот такой результат:
SUM_RULON_WEIGHTSUM_SHTRIPS_WEIGHT
140,72124,4

Спасибо
2 окт 13, 10:46    [14910749]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
goodler,
1. SUM (DISTINCT ...)
2. SUM (CASE WHEN ... THEN ... ESLE 0 END)
2 окт 13, 11:05    [14910898]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
goodler
Member

Откуда:
Сообщений: 6
ORA__SQL,
Спасибо, со штрипсами разобрался:
SUM (CASE WHEN NVL (ATTD1.ATT, 0) = 0 THEN Round(V1.ACTUAL_WEIGHT/1000,2) ELSE 0 END) as SUM_SHTRIPS_WEIGHT
но как быть с рулонами, в таблице могут быть разные рулоны с одинаковым весом, поэтому distinct тут наверно не получится, или я опять чего то не знаю?
2 окт 13, 13:43    [14912121]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
Corner
Member

Откуда:
Сообщений: 1270
сделайте пример исходных данных и желаемый результат для этого набора плюс словесное описание. Вам быстрее ответят, а вы потому уже допилите под ваше приложение.
2 окт 13, 13:47    [14912155]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
sergey.semka
Member

Откуда: Санкт-Петербург
Сообщений: 182
goodler,

Уважаемый, версия Oracle какая?
сложно предположить, что можно использовать... не зная версии...

А по поводу суммирования "не повторяющихся рулонов".
То есть плевать сколько раз и в каких строчках упоминаются значения... и просто если там есть значения, например: 10; 20; 30; 40; 50 - вам нужно просто в столбец вывести общую сумму отдельных?
Или по каждому типу рулона вывести сумму?

тогда что-то типа:
SUM (DISTINCT Round(V.ACTUAL_WEIGHT/1000,2)) OVER () as SUM_DISTINCT_coil_weight 

дописать... Вы уточните что нужно...
2 окт 13, 15:09    [14912764]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
sergey.semka
Member

Откуда: Санкт-Петербург
Сообщений: 182
goodler
ORA__SQL,
Спасибо, со штрипсами разобрался:
SUM (CASE WHEN NVL (ATTD1.ATT, 0) = 0 THEN Round(V1.ACTUAL_WEIGHT/1000,2) ELSE 0 END) as SUM_SHTRIPS_WEIGHT
но как быть с рулонами, в таблице могут быть разные рулоны с одинаковым весом, поэтому distinct тут наверно не получится, или я опять чего то не знаю?


Хотя, если это вам подошло, тогда вместо:
SUM (DISTINCT Round(V.ACTUAL_WEIGHT/1000,2)) OVER () as SUM_DISTINCT_coil_weight 

достаточно вписать:
SUM (DISTINCT Round(V.ACTUAL_WEIGHT/1000,2)) as SUM_DISTINCT_coil_weight 


Если в этом вопрос был?...
2 окт 13, 15:13    [14912801]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
sergey.semka
Member

Откуда: Санкт-Петербург
Сообщений: 182
Просто это как-то не конгруэнтно....
Что означает эта сумма?...
Я понимаю посчитать суммы по каждому заказу, по каждому типу рулонов и прочее....
А просто взять разные варианты... это как-то типа...
Есть у нас полка с книгами, на которой 500 книг, с 6 различными весами. И задача бы стояла типа посчитать суммарный вес 6 экземпляров различных книг из всех шкафов с подобной полкой...

Ничего не перепутали?
2 окт 13, 15:18    [14912861]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
sergey.semka
Member

Откуда: Санкт-Петербург
Сообщений: 182
Просто что-то там не так....
Например, как могу заметить: SHTRIPS_WEIGHT считается в пределах каждого PIECE_NUM_ID, NOMER_RULONA???

Тогда и вес должен считаться как-то типа:
SUM (DISTINCT Round(V.ACTUAL_WEIGHT/1000,2)) OVER (partition by PIECE_NUM_ID, NOMER_RULONA) as SUM_DISTINCT_coil_weight 


т.е. в пределах каждого номера рулона... или как-то так...
2 окт 13, 15:26    [14912945]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
goodler
Member

Откуда:
Сообщений: 6
Corner,
есть вот такая таблица
heat_idPIECE_NUM_IDNOMER_RULONAINTERNAL_STEEL_GRADE_IDCOIL_WEIGHTATT_ITOG_PROCPRODUCTION_DATETIMENOMER_SHTRIPSAPIECE_NUM_ID_STRIPSGRADE_SHTRIPSAPRODUCTION_DATETIME_STRIPSSHTRIPS_WEIGHTATT_ITOG_PROC_STRIPS
131454418580330109G2S-534,4710001.09.20130101186034309G2S-516.09.201332,66100
131454418580360209G2S-535,0410001.09.20130201186034009G2S-516.09.201333,2100
131454418580390309G2S-535,0310001.09.20130301186034109G2S-516.09.201333,26100
131454418580420409G2S-535,1210001.09.20130401186034209G2S-516.09.201332,86100
131454518580450109G2S-534,5210001.09.20130101186034709G2S-516.09.201332,62100
131454518580480209G2S-535,0210001.09.20130201186034809G2S-516.09.201333,14100
131454518580510309G2S-535,0510001.09.20130301186034609G2S-516.09.201333,2100
131454518580540409G2S-535,110001.09.20130401186034509G2S-516.09.201333,26100
131454518580570509G2S-535,1310001.09.20130501186034409G2S-516.09.201331,52100
131454618580640209G2S-534,5110001.09.20130201186035109G2S-516.09.201332,6100
131454618580660309G2S-535,1310001.09.20130301186034909G2S-516.09.201333,18100
131454618580690409G2S-535,1510001.09.20130401186035009G2S-516.09.201332,12100
131454718580720109G2S-534,5610001.09.20130101186035309G2S-516.09.201332,3100
131454718580840509G2S-511,87001.09.20130501186035209G2S-516.09.201310,9100
1314558185829003K52-234,2210001.09.201303011866263K52-228.09.201332,84100
131456318583650113HFA-1034,9110001.09.20130102-02186074013HFA-1019.09.20135,810
131456318583650113HFA-1034,9110001.09.20130102-01186073913HFA-1019.09.20135,810
131456318583650113HFA-1034,9110001.09.20130101-02186073713HFA-1019.09.201310,96100
131456318583650113HFA-1034,9110001.09.20130101-01186073613HFA-1019.09.201310,96100
131456318583680213HFA-1035,4410001.09.20130202186071213HFA-1019.09.201317,17100
131456318583680213HFA-1035,4410001.09.20130201186071113HFA-1019.09.201317,17100
131456318583720313HFA-103510001.09.20130301186076013HFA-1019.09.201317,04100
131456318583720313HFA-103510001.09.20130302186076113HFA-1019.09.201317,04100
131456318583750413HFA-1035,3710001.09.20130402186076913HFA-1019.09.201317,03100
131456318583750413HFA-1035,3710001.09.20130401186076813HFA-1019.09.201317,03100

мне нужно получить сумму столбца COIL_WEIGHT, причем, суммироваться должны строки в которых поле ATT_ITOG_PROC равно 100, и суммировать нужно уникальные рулоны(heat_id+PIECE_NUM_ID), т.е. получить сумму значений выделенных красным.
Как просуммировать поле SHTRIPS_WEIGHT, я уже разобрался(спасибо ORA__SQL за подсказку), но штрипсы проще суммировать поскольку они все уникальные
в результате должна получиться вот такая таблица
Sum_rulonSum_shtrips
628,77594,06

Запрос выглядит вот так, в нем расчитана сумма для штрипсов
select      
  
      SUM( Round(V1.ACTUAL_WEIGHT/1000,2)) as SUM_SHTRIPS      
      
from v_piece v     
     
    left join piece_relationship pr on pr.parent_piece_num_id = v.piece_num_id     
  AND pr.child_piece_num_id IN(SELECT v1.piece_num_id FROM V_PIECE V1 WHERE v1.product_type = 'HRC-CE'   AND V1.IS_COMPOSITE_FLAG = 'N' )    
     join v_piece v1 on v1.piece_num_id = pr.child_piece_num_id      
     
                            AND v1.product_type = 'HRC-CE'      
     
                            AND V1.IS_COMPOSITE_FLAG = 'N'     
 LEFT JOIN piece_relationship pr1 ON pr1.child_piece_num_id = v.piece_num_id     

    LEFT JOIN SALES_ORDER_HEADER SOH on SOH.SO_ID = V1.SO_ID                             
 
    LEFT JOIN SHTRIPS_T3_LPK STL ON V1.HEAT_ID = STL.SMELTING      
     
                                                    AND SUBSTR (LTRIM (V1.PIECE_ID, 0), 9, 1) =  SUBSTR (LTRIM ( STL.COIL_NUM, 0), 0, 1)   
                                                     
  AND  CASE WHEN  LENGTH(V1.PIECE_ID) >11 THEN  SUBSTR (LTRIM (V1.PIECE_ID, 0), 14, 1)   ELSE SUBSTR (LTRIM (V1.PIECE_ID, 0), 11, 1)    END = 
  CASE WHEN  LENGTH (STL.COIL_NUM) >2 THEN SUBSTR (LTRIM ( STL.COIL_NUM, 0), 5, 1)  ELSE SUBSTR (LTRIM ( STL.SHTRIPS, 0), 0, 1)    END 
                                                    AND V1.ACTUAL_WEIGHT = STL.MASS_IN*1000     
     
    LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                        FROM STY_PIECE_DEFECT     
     
                        WHERE ACTIVE_FLAG = 'Y'     
     
                        GROUP BY PIECE_NUM_ID) ATTD_A  ON V.PIECE_NUM_ID = ATTD_A.PIECE_NUM_ID     
     
  LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                      FROM STY_PIECE_DEFECT     
     
                      GROUP BY PIECE_NUM_ID) ATTD  ON V.PIECE_NUM_ID = ATTD.PIECE_NUM_ID                             
     
    LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                        FROM STY_PIECE_DEFECT     
     
                        WHERE ACTIVE_FLAG = 'Y'     
     
                        GROUP BY PIECE_NUM_ID) ATTD_A1  ON V1.PIECE_NUM_ID = ATTD_A1.PIECE_NUM_ID     
     
  LEFT JOIN (  SELECT COUNT (PIECE_NUM_ID) AS ATT, PIECE_NUM_ID     
     
                      FROM STY_PIECE_DEFECT     
     
                      GROUP BY PIECE_NUM_ID) ATTD1  ON V1.PIECE_NUM_ID = ATTD1.PIECE_NUM_ID       
                            
     
 where v.PRODUCTION_DATETIME BETWEEN TRUNC (:START_DATE)    AND TRUNC (:STOP_DATE) +1    
        AND v.product_type = 'HRC'  
2 окт 13, 15:37    [14913028]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
goodler
Member

Откуда:
Сообщений: 6
sergey.semka, версия oracle 11g
2 окт 13, 16:39    [14913579]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
zhal
Member

Откуда: Киев-Харьков
Сообщений: 647
SELECT SUM(CASE WHEN ATT_ITOG_PROC_STRIPS=100 AND rn=1 THEN COIL_WEIGHT END)
  FROM (SELECT v.*, row_number() OVER (PARTITION BY heat_id, PIECE_NUM_ID, ATT_ITOG_PROC_STRIPS, COIL_WEIGHT ORDER BY NULL) rn
          FROM v_piece v
         ......
       ) 
3 окт 13, 14:21    [14918539]     Ответить | Цитировать Сообщить модератору
 Re: Просуммировать столбцы по критерию  [new]
123йй
Member

Откуда:
Сообщений: 1635
select sum(COIL_WEIGHT) from (select COIL_WEIGHT from ....
where ATT_ITOG_PROC_STRIPS=100
group by COIL_WEIGHT
3 окт 13, 14:39    [14918699]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить