Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

asacap1000

Soma total dividido por anos

Recommended Posts

Galera estou com uma dúvida em um select.

 

Eu preciso trazer a soma de entrada em valores por cliente, e eu preciso que este total venha dividido por anos.

por exemplo cliente:

Zacarias valor de entradas (1000 em 2013) ,(1000 em 2014) e (500 em 2015).

 

Seria possível ele criar as colunas automaticamente com o nome dos anos trazendo o total de cada cliente dentro de cada ano?

 

Meu select é este:

---IMPORTAÇÃO---
select contagem.cnpj_cpf, contagem.name,contagem.moeda, sum (contagem.valor_rec) from (
SELECT decode(length(w.suchbegriff),
              14,
              substr(w.suchbegriff, 1, 2) || '.' ||
              substr(w.suchbegriff, 3, 3) || '.' ||
              substr(w.suchbegriff, 6, 3) || '/' ||
              substr(w.suchbegriff, 9, 4) || '-' ||
              substr(w.suchbegriff, 13, 2),
              substr(w.suchbegriff, 1, 3) || '.' ||
              substr(w.suchbegriff, 4, 3) || '.' ||
              substr(w.suchbegriff, 7, 3) || '-' ||
              substr(w.suchbegriff, 10, 2)) cnpj_cpf,
       w.name,
       W.MOEDA,
       (sum(w.valor_cif)) valor_rec,
       TRUNC(w.data_base) data_base,
       W.LOTE
  FROM (SELECT k.id_klient,
               k.name,
               k.suchbegriff,
               a.bruecke_1 LOTE,
               a.einh_waehr moeda,
               MAX(a.valor_cif) valor_cif,
               MIN(we.datum_we) data_base
          FROM we, anliefpos a, klienten k
         WHERE we.lager = a.lager
           and k.id_klient = a.id_klient
           and k.id_klient = we.id_klient
           AND we.nr_anlief = a.nr_anlief
           AND we.nr_anlief_pos = a.nr_anlief_pos
           AND a.stat <> 80
           AND a.bruecke_1 like 'A%' --importação
         GROUP BY a.lager,
                  a.bruecke_1,
                  k.name,
                  k.suchbegriff,
                  k.id_klient,
                  a.einh_waehr) w
 WHERE w.data_base >= to_date('&inicio', 'dd/mm/yyyy')
   and w.data_base <= to_date('&fim', 'dd/mm/yyyy')
 GROUP BY TRUNC(w.data_base),
          w.name,
          decode(length(w.suchbegriff),
                 14,
                 substr(w.suchbegriff, 1, 2) || '.' ||
                 substr(w.suchbegriff, 3, 3) || '.' ||
                 substr(w.suchbegriff, 6, 3) || '/' ||
                 substr(w.suchbegriff, 9, 4) || '-' ||
                 substr(w.suchbegriff, 13, 2),
                 substr(w.suchbegriff, 1, 3) || '.' ||
                 substr(w.suchbegriff, 4, 3) || '.' ||
                 substr(w.suchbegriff, 7, 3) || '-' ||
                 substr(w.suchbegriff, 10, 2)),
          W.LOTE,
          W.MOEDA)contagem group by contagem.cnpj_cpf, contagem.name,contagem.moeda order by contagem.name asc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Showww de bola Motta, olha como ficou.

---IMPORTAÇÃO---
select distinct contagem.cnpj_cpf,
       contagem.name,
       contagem.moeda,
       case
         when contagem.ano = 2012 then
          sum(contagem.valor_rec)
       end as "2012",
       case
         when contagem.ano = 2013 then
          sum(contagem.valor_rec)
       end as "2013",
       case
         when contagem.ano = 2014 then
          sum(contagem.valor_rec)
       end as "2014",
       case
         when contagem.ano = 2015 then
          sum(contagem.valor_rec)
       end as "2015"
  from (SELECT decode(length(w.suchbegriff),
                      14,
                      substr(w.suchbegriff, 1, 2) || '.' ||
                      substr(w.suchbegriff, 3, 3) || '.' ||
                      substr(w.suchbegriff, 6, 3) || '/' ||
                      substr(w.suchbegriff, 9, 4) || '-' ||
                      substr(w.suchbegriff, 13, 2),
                      substr(w.suchbegriff, 1, 3) || '.' ||
                      substr(w.suchbegriff, 4, 3) || '.' ||
                      substr(w.suchbegriff, 7, 3) || '-' ||
                      substr(w.suchbegriff, 10, 2)) cnpj_cpf,
               w.name,
               W.MOEDA,
               (sum(w.valor_cif)) valor_rec,
               TRUNC(w.data_base) data_base,
               to_char(w.data_base, 'yyyy') ANO,
               W.LOTE
          FROM (SELECT k.id_klient,
                       k.name,
                       k.suchbegriff,
                       a.bruecke_1 LOTE,
                       a.einh_waehr moeda,
                       MAX(a.valor_cif) valor_cif,
                       MIN(we.datum_we) data_base
                  FROM we, anliefpos a, klienten k
                 WHERE we.lager = a.lager
                   and k.id_klient = a.id_klient
                   and k.id_klient = we.id_klient
                   AND we.nr_anlief = a.nr_anlief
                   AND we.nr_anlief_pos = a.nr_anlief_pos
                   AND a.stat <> 80
                   AND a.bruecke_1 like 'A%' --importação
                 GROUP BY a.lager,
                          a.bruecke_1,
                          k.name,
                          k.suchbegriff,
                          k.id_klient,
                          a.einh_waehr) w
         WHERE w.data_base >= to_date('&inicio', 'dd/mm/yyyy')
           and w.data_base <= to_date('&fim', 'dd/mm/yyyy')
         GROUP BY TRUNC(w.data_base),
                  to_char(w.data_base, 'yyyy'),
                  w.name,
                  decode(length(w.suchbegriff),
                         14,
                         substr(w.suchbegriff, 1, 2) || '.' ||
                         substr(w.suchbegriff, 3, 3) || '.' ||
                         substr(w.suchbegriff, 6, 3) || '/' ||
                         substr(w.suchbegriff, 9, 4) || '-' ||
                         substr(w.suchbegriff, 13, 2),
                         substr(w.suchbegriff, 1, 3) || '.' ||
                         substr(w.suchbegriff, 4, 3) || '.' ||
                         substr(w.suchbegriff, 7, 3) || '-' ||
                         substr(w.suchbegriff, 10, 2)),
                  W.LOTE,
                  W.MOEDA) contagem
 group by contagem.cnpj_cpf, contagem.name, contagem.moeda,contagem.ano
 order by contagem.name asc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos o Motta me deu a maior força no select abaixo, este foi colocado em um tópico anterior, agora só para finalizar minha dúvida.

A empresa gostou do relatório só que pediram para trazer na mesma linhas as informações. Por exemplo utilizando os Case ele cria uma linha para cada ano, por exemplo teve valores em 2013 ele preenche uma linha, e os outros campos ficam vazios se teve entrada em 2015 ele cria outra linha agora com os outros campos vazios e somente. Como eu poderia configurar para trazer na mesma linha?

select distinct contagem.id_klient, contagem.cnpj_cpf,
                        contagem.name,
                        contagem.moeda,
                        case
                          when contagem.ano = 2012 then
                           sum(contagem.valor_rec)
                        end as "2012",
                        case
                          when contagem.ano = 2013 then
                           sum(contagem.valor_rec)
                        end as "2013",
                        case
                          when contagem.ano = 2014 then
                           sum(contagem.valor_rec)
                        end as "2014",
                        case
                          when contagem.ano = 2015 then
                           sum(contagem.valor_rec)
                        end as "2015"
          from (SELECT w.id_klient, decode(length(w.suchbegriff),
                              14,
                              substr(w.suchbegriff, 1, 2) || '.' ||
                              substr(w.suchbegriff, 3, 3) || '.' ||
                              substr(w.suchbegriff, 6, 3) || '/' ||
                              substr(w.suchbegriff, 9, 4) || '-' ||
                              substr(w.suchbegriff, 13, 2),
                              substr(w.suchbegriff, 1, 3) || '.' ||
                              substr(w.suchbegriff, 4, 3) || '.' ||
                              substr(w.suchbegriff, 7, 3) || '-' ||
                              substr(w.suchbegriff, 10, 2)) cnpj_cpf,
                       w.name,
                       W.MOEDA,
                       (sum(w.valor_cif)) valor_rec,
                       TRUNC(w.data_base) data_base,
                       to_char(w.data_base, 'RRRR') ANO,
                       W.LOTE
                  FROM (SELECT k.id_klient,
                               k.name,
                               k.suchbegriff,
                               a.bruecke_1 LOTE,
                               a.einh_waehr moeda,
                               MAX(a.valor_cif) valor_cif,
                               MIN(we.datum_we) data_base
                          FROM we, anliefpos a, klienten k
                         WHERE we.lager = a.lager
                           and k.id_klient = a.id_klient
                           and k.id_klient = we.id_klient
                           AND we.nr_anlief = a.nr_anlief
                           AND we.nr_anlief_pos = a.nr_anlief_pos
                           AND a.stat <> 80
                           AND a.bruecke_1 like 'A%' --importação
                         GROUP BY a.lager,
                                  a.bruecke_1,
                                  k.name,
                                  k.suchbegriff,
                                  k.id_klient,
                                  a.einh_waehr) w
                 WHERE w.data_base >= to_date('&inicio', 'dd/mm/yyyy')
                   and w.data_base <= to_date('&fim', 'dd/mm/yyyy')
                   --and w.id_klient = '862'
                 GROUP BY TRUNC(w.data_base),
                          w.id_klient,
                          to_char(w.data_base, 'RRRR'),
                          w.name,
                          decode(length(w.suchbegriff),
                                 14,
                                 substr(w.suchbegriff, 1, 2) || '.' ||
                                 substr(w.suchbegriff, 3, 3) || '.' ||
                                 substr(w.suchbegriff, 6, 3) || '/' ||
                                 substr(w.suchbegriff, 9, 4) || '-' ||
                                 substr(w.suchbegriff, 13, 2),
                                 substr(w.suchbegriff, 1, 3) || '.' ||
                                 substr(w.suchbegriff, 4, 3) || '.' ||
                                 substr(w.suchbegriff, 7, 3) || '-' ||
                                 substr(w.suchbegriff, 10, 2)),
                          W.LOTE,
                          W.MOEDA) contagem
         group by contagem.cnpj_cpf,
         contagem.id_klient,
                  contagem.name,
                  contagem.moeda,
                  contagem.ano
         order by contagem.name asc

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao sei se entendi mas tente montar os cases assim ...

 

 

 

Sum(case when contagem.ano = 2012 then contagem.valor_rec else 0 end) as "2012",

...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao sei se entendi mas tente montar os cases assim ...

 

 

 

Sum(case when contagem.ano = 2012 then contagem.valor_rec else 0 end) as "2012",

...

Desta forma ela apenas adiciona o zero se null, deixa eu tentar explicar:

Segue imagem:
imagem.JPG

Pode ver que o mesmo cliente me retorna 03 linhas uma para cada ano com valor de entrada.

Eles me pediram para trazer em uma linha apenas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente tirar o ANO do group by.

Os valores de cnpj e namesão diferentes ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente tirar o ANO do group by.

Os valores de cnpj e namesão diferentes ?

Vou testar tirando o ano.

 

Os valores outros valores são iguais

Tente tirar o ANO do group by.

Os valores de cnpj e namesão diferentes ?

Meu amigo quem sabe sabe, não havia e atentado para o group. agora está 100%. Valeu mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.