How to add several decodes in the same line?

Asked

Viewed 242 times

1

I need to group the fields of the Code in the same line some hint

follows SQL

SELECT DISTINCT

   iTG.GUI_NUMERO " NUMERO GUIA ",

DECODE(itg.pro_tipo_procedimento,'MAT',
   sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)), NULL) MAT,
DECODE(itg.pro_tipo_procedimento,'TMA',
   sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)), NULL) TMA,
DECODE(itg.pro_tipo_procedimento,'HOS',
   sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)), NULL) HOS,
DECODE(itg.pro_tipo_procedimento,'TME',
   sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)), NULL) TME,
DECODE(itg.pro_tipo_procedimento,'MED',
   sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)), NULL) MED

FROM
     unimed.item_guia itg
WHERE
      --Itg.GUI_PAGTO = 'S'
  Itg.GUI_STATUS = 'N'
  AND Itg.GUI_SITUACAO = 'AP'
  and itg.pro_tipo_procedimento in ('MAT','MED','HOS','TME','TMA')
  and itg.gui_numero in (69940371)
GROUP BY 
    iTG.GUI_NUMERO, 
    itg.pro_tipo_procedimento;

inserir a descrição da imagem aqui

2 answers

1


Try.

SELECT iTG.GUI_NUMERO, 

       itg.pro_tipo_procedimento,

sum(case when itg.pro_tipo_procedimento='MAT' 
         then NVL(itg.GUI_VALOR_PAGO_CUS,0) +  NVL(itg.GUI_VALOR_PAGO_FIL,0) NVL(itg.GUI_VALOR_PAGO_SER,0))
         else 0 end) mat, 

sum(case when itg.pro_tipo_procedimento='TMA' 
         then NVL(itg.GUI_VALOR_PAGO_CUS,0) +  NVL(itg.GUI_VALOR_PAGO_FIL,0) NVL(itg.GUI_VALOR_PAGO_SER,0))
         else 0 end) TMA

sum(case when itg.pro_tipo_procedimento='HOS' 
         then NVL(itg.GUI_VALOR_PAGO_CUS,0) +  NVL(itg.GUI_VALOR_PAGO_FIL,0) NVL(itg.GUI_VALOR_PAGO_SER,0))
         else 0 end) HOS

sum(case when itg.pro_tipo_procedimento='TME' 
         then NVL(itg.GUI_VALOR_PAGO_CUS,0) +  NVL(itg.GUI_VALOR_PAGO_FIL,0) NVL(itg.GUI_VALOR_PAGO_SER,0))
         else 0 end) TME,

sum(case when itg.pro_tipo_procedimento='MED' 
         then NVL(itg.GUI_VALOR_PAGO_CUS,0) +  NVL(itg.GUI_VALOR_PAGO_FIL,0) NVL(itg.GUI_VALOR_PAGO_SER,0))
         else 0 end) MED


FROM
     unimed.item_guia itg
WHERE
      --Itg.GUI_PAGTO = 'S'
  Itg.GUI_STATUS = 'N'
  AND Itg.GUI_SITUACAO = 'AP'
  and itg.pro_tipo_procedimento in ('MAT','MED','HOS','TME','TMA')
  and itg.gui_numero in (69940371)
GROUP BY 
    iTG.GUI_NUMERO, 
    itg.pro_tipo_procedimento;

There may be some syntax error because I can’t test

  • this presenting this error ORA-00937: is not a simple group function 00937. 00000 - "not a single-group group Function" *Cause: *Action: Line error: 3 Column: 1

0

Run the query below:

   select 
       numero_guia, 
       sum(mat) mat, 
       sum(tma) tma, 
       sum(hos) hos, 
       sum(tme) tme, 
       sum(med) med 
    from (
        select itg.gui_numero numero_guia, 
           sum(case when itg.pro_tipo_procedimento = 'MAT' 
               then itg.gui_valor_pago_cus + 
                    itg.gui_valor_pago_fil + 
                    itg.gui_valor_pago_ser 
                    else 0                          end ) mat,
           sum(case when itg.pro_tipo_procedimento = 'TMA' 
                    then itg.gui_valor_pago_cus + 
                    itg.gui_valor_pago_fil + 
                    itg.gui_valor_pago_ser 
                    else 0                          end) tma,
           sum(case when itg.pro_tipo_procedimento = 'HOS' 
                    then itg.gui_valor_pago_cus + 
                         itg.gui_valor_pago_fil + 
                         itg.gui_valor_pago_ser 
                    else 0                          end) hos,
            sum(case when itg.pro_tipo_procedimento = 'TME' 
                     then itg.gui_valor_pago_cus +
                          itg.gui_valor_pago_fil +
                          itg.gui_valor_pago_ser 
                     else 0                         end) tme,
            sum(case when itg.pro_tipo_procedimento = 'MED' 
                     then itg.gui_valor_pago_cus +
                          itg.gui_valor_pago_fil + 
                          itg.gui_valor_pago_ser 
                     else 0                         end) med
       FROM  item_guia itg
       WHERE Itg.GUI_STATUS             = 'N'
         AND Itg.GUI_SITUACAO           = 'AP'
         AND itg.pro_tipo_procedimento IN ('MAT','MED','HOS','TME','TMA')
         AND itg.gui_numero            IN (69940371)
GROUP BY iTG.GUI_NUMERO,
  itg.pro_tipo_procedimento
) resultado
group by numero_guia;


The expected result will be equal to:

inserir a descrição da imagem aqui

  • would look this way ?

  • select numero_guia, sum('MAT') mat, sum('MED') tma, sum('HOS') hos, sum('TME') tme, sum('TMA') med from ( SELECT iTG.GUI_NUMERO ,sum(NVL(itg.GUI_VALOR_PAGO_CUS,0)) + sum('MED') sum(NVL(itg.GUI_VALOR_PAGO_FIL,0)) + sum(NVL(itg.GUI_VALOR_PAGO_SER,0)) "TOTAL PAGO"
 
FROM item_guia itg
WHERE
 --Itg.GUI_PAGTO = 'S'
 Itg.GUI_STATUS = 'N'
 AND Itg.GUI_SITUACAO = 'AP'
 and itg.pro_tipo_procedimento in ('MAT','MED','HOS','TME','TMA') and itg.gui_numero in (69940371) ) result group by numero_guia;

  • Not Alan Darold. You should keep your DECODE. Anyway I remade my answer to be more objective in the result and I hope you try to use it (fix if there are problems). I am using CASE instead of DECODE for private taste but either of the two can be used in this case.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.