Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Como somar a coluna C somente dos valores distintos da coluna A?

Olá pessoal!!

Preciso somar os valores da Coluna C, porém, somente  dos valores distintos da Caluna A. Como posso fazer isso?

Exemplo:

Tab.jpg

Total errado   R$ 35,00

Total Correto  (Distinto da col A)   R$ 25,00

Desde já Obrigado!

1 Solution

Accepted Solutions
Not applicable
Author

ola, vc pode usar a funcao aggr para agrupar a coluna A...  sum(aggr(C,A))

View solution in original post

9 Replies
Not applicable
Author

ola, vc pode usar a funcao aggr para agrupar a coluna A...  sum(aggr(C,A))

Not applicable
Author

Olá Fábio!

Obrigado pela ajuda. Esse método funciona, porém, a tabela possui mais de 6 milhoes de registros e toda vez que o Qlikview tenta executar essa função causa estouro de memória.

Teria outra maneira?

Not applicable
Author

Você pode usar a função Previous, na Clausula WHERE.


LOAD

A,
B,
C
FROM
C:\Users\edison\Desktop\teste.txt
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq)
WHERE(Previous(A)<>A);

Dessa forma, ele carregar somente um registro por ID(1º), mas o arquivo tem que estar ordenado.

aderlanrm
Partner - Specialist
Partner - Specialist

Olá Davidson, tudo bem?

Você pode usar agrupamento:

LOAD MinString(Codigo) as Codigo,

    MinString(Descrição) as Descrição,

    MinString(Valor) as MenorValor,

    MaxString(Valor) as MaiorValor,

    sum(Valor) as SomaValor,

    avg(Valor) as MediaValor

INLINE [

    Codigo, Descrição, Valor

    1, Dinheiro, "5,00"

    1, Cupom, "15,00"

    2, Cheque, "5,00"

    3, Cartão, "5,00"

    4, Boleto, "5,00"

    4, Dinheiro, "5,00"

    5, Cartão, "5,00"

]

Group By Codigo;

A vantagem é que você pode usar outras funções para tratar as repetições, como no exemplo que te passei, tem coluna com valor, menor, maior, suma, média... e todas as outras funções que podem ser usadas com agragação. Não esqueça de trocar o INLINE por o FROM em sua tabela.

Importante lembrar que para grande quantidade de dados, seu caso, tudo que puder ser feito no script é melhor, pois a diferença de desempenho é considerável.

Espero que ajude, grande abraço.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
cesaraccardi
Specialist
Specialist

Olá Davidson, esta tabela que você postou está sendo carregada originalmente desta forma ou é resultado de alguma junção com outra tabela? Você já considerou a hipótese de separar estes dados para não ter o problema de tratar a duplicidade?

Abs.

Not applicable
Author

Edison,

Obrigado, mas preciso levar todos os IDs, pois a forma de pagamento são diferentes e tb preciso levá-las.

Aderlan,

Obrigado tb, mas é a mesma questão... Não posso agrupar os IDs na tabela, a não ser que criasse outra só com o valor total por ID. Mas são muitos registros (+ de 6 milhões) e me traria mais problemas de performance.

Mas gostei da observação!

Cesar,

Precisa ser carregada desta forma.

Pessoal,

A função aggr que o fábio sugeriu resolve a questão. O problema é que o servidor atualmente está com 4GB de memória (por limitação do SO de 32bits) e está causando estouro de memória. Trocaremos a máquina para uma com 16GB, mas enquanto isso...

aderlanrm
Partner - Specialist
Partner - Specialist

Sem problemas Davidson,

Basta você tirar a coluna de descrição do primeiro LOAD e fazer um segundo load apenas das descrições, vinculando as duas pelo código. O EXISTS é apenas para não carregar descrições que não tenham valores que foram carregados antes, como o volume de dados é muito grande, é bom não carregar o que não será útil, por isso também retirar as descrições do primeiro load. Mais uma dica, use o DISTINCT no segundo LOAD para não carregas a mesma descrição e o mesmo código duas vezes. Abraço.

Veja:

Valores:

LOAD MinString(Codigo) as Codigo,

    MinString(Valor) as MenorValor,

    MaxString(Valor) as MaiorValor,

    sum(Valor) as SomaValor,

    avg(Valor) as MediaValor

INLINE [

    Codigo, Valor

    1, "5,00"

    1, "15,00"

    2, "5,00"

    3, "5,00"

    4, "5,00"

    4, "5,00"

    5, "5,00"

]

Group By Codigo;

Descrições:

LOAD Codigo,

    Descrição

INLINE [

    Codigo, Descrição

    1, Dinheiro

    1, Cupom

    2, Cheque

    3, Cartão

    4, Boleto

    4, Dinheiro

    5, Cartão

]

Where Exists(Codigo,Codigo);

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
Not applicable
Author

Obrigado Aderlan!

aderlanrm
Partner - Specialist
Partner - Specialist

Imagine, é sempre bom ajudar.

Não esqueça de marcar as resposta para também ajudar a outros na comunidade que estão com a mesma dúvida.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)