Agrupamento dos Valores de um Mês

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Bom dia pessoal, estou meio travado numa query aqui, eu estou fazendo um indicador de faturamento por mês das unidades de Internação de um Hospital.

a Idéia é o seguinte: Dentro da unidade de internação eu tenho vários leitos e para achar o faturamento eu tenho que somar todos os valores dos itens lançados nas contas dos pacientes que passaram nesses leitos dentro do periodo x até y

Eu fiz essa query de duas maneiras a primeira me traz o faturamento de cada leito por dia e a segunda o faturamento de cada unidade de interação por dia (que seria a soma de todos os leitos que pertencem a aquela unidade)

Meu problema é que eu preciso somar todos os dias dentro do período para achar o valor faturado no mês
A query abaixo me traz o faturado por dia de todos os dias de maio de cada unidade de internação, só que me traz uma linha por dia e eu precisaria apenas 1 linha com o total do Mês (a soma dos dias) de cada unidade. Alguém pode me dar uma força?

Selecionar tudo

SELECT unidade_int CODIGO_UNI,des_unidade NOME, sum(VALOR_TOTAL) TOTAL, DATA_LANC LANÇAMENTO
 
FROM
             (SELECT  
             u.CD_UNID_INT unidade_int,
             u.DS_UNID_INT des_unidade, 
                      sum(i.VL_TOTAL_CONTA) VALOR_TOTAL,
                      (to_date (i.DT_LANCAMENTO, 'DD/MM/rrrr')) DATA_LANC
                                 
              FROM dbamv.ATENDIME a, dbamv.REG_FAT r, dbamv.ITREG_FAT i, dbamv.leito l, UNID_INT u
              
              WHERE a.cd_atendimento = r.cd_atendimento
                    AND   r.CD_REG_FAT = i.CD_REG_FAT
                    AND   a.CD_LEITO = l.CD_LEITO
                    AND   l.CD_UNID_INT = u.CD_UNID_INT
                  
              GROUP BY u.CD_UNID_INT,u.DS_UNID_INT, a.cd_leito, l.ds_leito, r.CD_ATENDIMENTO, (to_date (i.DT_LANCAMENTO, 'DD/MM/rrrr')) 
              ORDER BY  u.CD_UNID_INT)
 
WHERE DATA_LANC BETWEEN '01/05/2012' AND '31/05/2012'
GROUP BY unidade_int, des_unidade,DATA_LANC
ORDER BY unidade_int, DATA_LANC
Agradeço desde já
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Bem.
Pelo que entendi a solução é simples: Desagrupa a data. Visto que você passa um range de data compreendendo um mês. Mas caso possa ser mais de um mês Só formatar o campo para trazer referente ao mês e agrupar por isso.

Outra coisa, você fez um select por fora do seu selct principal desnecesáriamente.
Olha o que acho que deveria ser então:

Selecionar tudo

SELECT u.cd_unid_int codigo_uni
      ,u.ds_unid_int nome
      ,SUM(i.vl_total_conta) total
      ,TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MON-RRR')
  FROM dbamv.atendime  a
      ,dbamv.reg_fat   r
      ,dbamv.itreg_fat i
      ,dbamv.leito     l
      ,unid_int        u
 WHERE a.cd_atendimento = r.cd_atendimento
   AND r.cd_reg_fat = i.cd_reg_fat
   AND a.cd_leito = l.cd_leito
   AND l.cd_unid_int = u.cd_unid_int
   AND to_date(i.dt_lancamento, 'DD/MM/RRRR') BETWEEN '01/05/2012' AND '31/05/2012'
 GROUP BY u.cd_unid_int
         ,u.ds_unid_int
         ,TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MON-RRR')
 ORDER BY u.cd_unid_int
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Cara seu eu pudesse te dava um beijo (sacanagem rsrsrs)

Ficou exatamente como eu precisava, só preciso entender o que você fez aqui

Obrigado novamente
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Se você parecer com uma panicat e for do sexo feminino, aceito. Hehehehe.
Mas sim, Esse campo que tem a data , não já é tipo DATE??? Se for, não precisa desse TO_DATE().
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Cara só mais uma forcinha, se fosse pra mostrar todos os meses como abaixo, como eu faria para que ficassedos os meses?



Unidades de Internação/ Faturou no mês:

Uni./Janeiro/fevereiro/março
A /10,00 /15,00 /12,00
B /20,00 /08,00 /15,00
C /30,00 /16,00 /21,00

Obrigado novamente
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Se seu oracle for o 11g, olha a função PIVOT() que ela deve lhe atender.
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Aqui é o 10 :cry:
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Nesse caso se eu fizesse um DECODE e usasse essa query como sub-select funcionaria?

Estou procurando o equivalente a PIVOT para a versão 10g e achei um artigo falando DECODE,não sei essa seria a solução, mas sou novo nessa area e não manjo muito bem, aquela primeira query que postei foi com muito esforço e até fiquei meio besta de ver que uma menor teve o resultado melhor rsrs
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Tenta com Case expression algo mais ou menos assim:

Selecionar tudo

SELECT u.cd_unid_int codigo_uni
      ,u.ds_unid_int nome
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '01' then i.vl_total_conta end) Janeiro
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '02' then i.vl_total_conta end) Fevereiro
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '03' then i.vl_total_conta end) Marco
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '04' then i.vl_total_conta end) Abril
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '05' then i.vl_total_conta end) Maio
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '06' then i.vl_total_conta end) Junho
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '07' then i.vl_total_conta end) Julho
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '08' then i.vl_total_conta end) Agosto
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '09' then i.vl_total_conta end) Setembro
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '10' then i.vl_total_conta end) Outubro
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '11' then i.vl_total_conta end) Novembro
      ,SUM(case when TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MM') = '12' then i.vl_total_conta end) Dezembro
      ,TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MON-RRR')
  FROM dbamv.atendime  a
      ,dbamv.reg_fat   r
      ,dbamv.itreg_fat i
      ,dbamv.leito     l
      ,unid_int        u
WHERE a.cd_atendimento = r.cd_atendimento
   AND r.cd_reg_fat = i.cd_reg_fat
   AND a.cd_leito = l.cd_leito
   AND l.cd_unid_int = u.cd_unid_int
   AND to_date(i.dt_lancamento, 'DD/MM/RRRR') BETWEEN '01/05/2012' AND '31/05/2012'
GROUP BY u.cd_unid_int
         ,u.ds_unid_int
         ,TO_CHAR(to_date(i.dt_lancamento, 'DD/MM/RRRR'),'MON-RRR')
ORDER BY u.cd_unid_int
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

fsitja com esse código aparece a formatação do jeito certo mas todos os campos aparecem NULL em todos os meses tirando Maio que aparece os valores certinho


Tentei alterar o range da data para 01/01/2012 até 31/12/2012 e ele traz todos os valores mas um mês em cada linha e todos os outros campos com NULL exemplo:

Selecionar tudo

Uni./Janeiro/fevereiro/março 
A    /Null    /15,00 /Null
A    /20,00 /Null    /Null
A    /Null    /Null    /21,00
B    /Null    /12,00 /Null
B    /25,00 /Null    /Null
B    /Null    /Null    /18,00
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Provavelmente é só tirar a data do group by, vê se seria isso por favor.
vonzodas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 11
Registrado em: Qua, 20 Jun 2012 9:00 am

Daniel N.N. e fsitja cara Valeu mesmo pela força, se algum dia você vierem pra SP me deem um toque, que eu pago uma cerveja pros dois rsrs
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

estou é com medo depois de seu agradecimento inicial, hehehe.
Beleza, estamos aqui para ajudar.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

vonzodas escreveu:Daniel N.N. e fsitja cara Valeu mesmo pela força, se algum dia você vierem pra SP me deem um toque, que eu pago uma cerveja pros dois rsrs
De nada vonzodas, grato em poder ajudar.

Oracle Open World Latin America hein! rs :-o
Responder
  • Informação