Consulta SQL - Porcentagem
04/01/2016
0
select a.nome_canal, count(id_controle_entrada_macro) * 100 / cast((select count(1) from controle_entrada_macro_tb) as float(1)) from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal
Ele retorna os dados assim:
Estipulante X | 27,81351
Estipulante Y | 0,4823151
Estipulante X | 32,79743
Estipulante Y | 22,34727
e assim ele vai montando até completar certinho a porcentagem, porém, eu queria diferente, exemplo, se um estipulante tem um produto, ou seja, foi rodado com sucesso, então eu queria que ele mostrasse assim:
Estipulante X | 100,00% rodou um, e foi com sucesso
Estipulante Y | 50,00 % rodou dois, e um com sucesso
Na minha consulta anterior, isso não acontece, ele contabiliza TODOS e faz o calculo da porcentagem baseado na contagem de todos os números...
Poderiam me ajudar? Agradeço desde já
Patrick
Post mais votado
05/01/2016
mas vc esta com dois selects, esse segundo select deveria estar dentro dos parenteses, e vc poderia usar um union all.
Acho que ficaria mais ou menos assim.
select nome_canal, sum(total_sucesso) total_sucesso, sum(total_erro) total_erro from ( select a.nome_canal, count(c.id_controle_entrada_macro) as total_sucesso, 0 total_erro from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal union all select a.nome_canal, 0 total_sucesso, count(c.id_controle_entrada_macro) as total_erro from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada GROUP BY a.nome_canal ) as teste1
acho que seria isso.
Alex Lekao
Mais Posts
05/01/2016
Isaac Jose
primeiro faça um select agrupando X e Y depois faça outro para obter o percentual.
05/01/2016
Patrick
primeiro faça um select agrupando X e Y depois faça outro para obter o percentual.
Isaac, bom dia! poderia ser mais claro? Se possível, com algum exemplo...
Grato.
05/01/2016
Alex Lekao
Exemplo:
SELECT OPERACAO2 CAMPO, OPERACAO2 CAMPO2, OPERACAO2 CAMPO3 FROM (SELECT OPERACAO1 CAMPO, OPERACAO1 CAMPO2, OPERACAO1 CAMPO3 FROM TABELA) AS OPERACAO2
nao me lembro exatamente do codigo, mas acredito que essa seja a ideia.
faz um tempinho q nao uso. rsrsr
05/01/2016
Patrick
Exemplo:
SELECT OPERACAO2 CAMPO, OPERACAO2 CAMPO2, OPERACAO2 CAMPO3 FROM (SELECT OPERACAO1 CAMPO, OPERACAO1 CAMPO2, OPERACAO1 CAMPO3 FROM TABELA) AS OPERACAO2
nao me lembro exatamente do codigo, mas acredito que essa seja a ideia.
faz um tempinho q nao uso. rsrsr
Eu consegui montar isso agora:
select a.nome_canal, count(id_arquivo) TOTAL_SUCESSO, ( select count(id_controle_entrada_macro) from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada group by a.nome_canal) TESTE from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = ('SUCESSO') group by a.nome_canal
Porém está dando erro na subquery, que retorna mais de um resultado, como eu poderia corrigir isso?
05/01/2016
Alex Lekao
Vamos por parte entao, para tentar chegar num consenso.
o Seu select atual retorna esses dados, certo?
Estipulante X | 27,81351
Estipulante Y | 0,4823151
Estipulante X | 32,79743
Estipulante Y | 22,34727
esses valores a frente do pipe sao os percentuais, correto?
o que vc quer, eh que apresente agrupado e totalizando os percentuais e informando que foram dois itens, x e y, certo?
primeiro, teremos que ter a primeira parte dos dados, para depois fazer a select externa, do exemplo que citei, para fazer os outros calculos. ok?
vamos por partes, vamos chegar ao primeiro resultado primeiro, ok?
coloque um select que vc chegue nos primeiros dados, ai daremos sequencia.
05/01/2016
Patrick
Vamos por parte entao, para tentar chegar num consenso.
o Seu select atual retorna esses dados, certo?
Estipulante X | 27,81351
Estipulante Y | 0,4823151
Estipulante X | 32,79743
Estipulante Y | 22,34727
esses valores a frente do pipe sao os percentuais, correto?
o que vc quer, eh que apresente agrupado e totalizando os percentuais e informando que foram dois itens, x e y, certo?
primeiro, teremos que ter a primeira parte dos dados, para depois fazer a select externa, do exemplo que citei, para fazer os outros calculos. ok?
vamos por partes, vamos chegar ao primeiro resultado primeiro, ok?
coloque um select que vc chegue nos primeiros dados, ai daremos sequencia.
Ok, o select que chega nos primeiros dados ditos anteriormente é esse:
select a.nome_canal, count(id_controle_entrada_macro) * 100 / cast((select count(1) from controle_entrada_macro_tb) as float(1)) -- + convert(numeric,(10),3) '%' from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal
Assim ele mostra:
Estipulante X | 27,81351
Estipulante Y | 0,4823151
Estipulante X | 32,79743
Estipulante Y | 22,34727
E agora?
05/01/2016
Alex Lekao
Exemplo:
select nome_canal, Porcentagem from ( select a.nome_canal, count(id_controle_entrada_macro) * 100 / cast((select count(1) from controle_entrada_macro_tb) as float(1)) as porcentagem -- + convert(numeric,(10),3) '%' from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal ) as teste
baseicamente seria assim o codigo.
onde eu coloquei nome_canal e porcentagem, é onde vc ira fazer a manipulacao dos dados para atingir os outros resultados que vc quer.
no exemplo eu so coloquei para informar os campos novamente, nao coloquei nenhuma informacao de calculo etc.
05/01/2016
Patrick
Exemplo:
select nome_canal, Porcentagem from ( select a.nome_canal, count(id_controle_entrada_macro) * 100 / cast((select count(1) from controle_entrada_macro_tb) as float(1)) as porcentagem -- + convert(numeric,(10),3) '%' from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal ) as teste
baseicamente seria assim o codigo.
onde eu coloquei nome_canal e porcentagem, é onde vc ira fazer a manipulacao dos dados para atingir os outros resultados que vc quer.
no exemplo eu so coloquei para informar os campos novamente, nao coloquei nenhuma informacao de calculo etc.
Com essa consulta, eu consegui trazer a quantidade de produtos com sucesso e com erro
select nome_canal, total_sucesso, total_erro from ( select a.nome_canal, count(c.id_controle_entrada_macro) as total_sucesso from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal ) as teste, ( select count(c.id_controle_entrada_macro) as total_erro from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada GROUP BY a.nome_canal ) as teste1
Porém ele está trazendo dados repetidos dos estipulantes,
Ex: Estipulante X | 214
Estipulante Y | 105
Estipulante X | 214
Estipulante Y | 105
Tanto no sucesso quanto no erro, como eu poderia corrigir isso?
05/01/2016
Patrick
mas vc esta com dois selects, esse segundo select deveria estar dentro dos parenteses, e vc poderia usar um union all.
Acho que ficaria mais ou menos assim.
select nome_canal, sum(total_sucesso) total_sucesso, sum(total_erro) total_erro from ( select a.nome_canal, count(c.id_controle_entrada_macro) as total_sucesso, 0 total_erro from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada where descricao_erro = 'SUCESSO' GROUP BY a.nome_canal union all select a.nome_canal, 0 total_sucesso, count(c.id_controle_entrada_macro) as total_erro from canal_tb as a join controle_entrada_tb as b on a.id_canal = b.id_canal join controle_entrada_macro_tb as c on b.id_controle_entrada = c.id_controle_entrada GROUP BY a.nome_canal ) as teste1
acho que seria isso.
Perfeito, só adicionei um GROUP BY no final fora dos parenteses, muito obrigado, agora para eu fazer o calculo da porcentagem, como ficaria, entre esses dois selects, eu colocaria PRIMEIRO valor * 100 / pelo segundo valor? Poderia me ajudar nisso?
05/01/2016
Alex Lekao
Vamos ver se eu entendi o que vc esta querendo fazer.
Bom, como tem total de sucessos e total de erros, esses valores seriam o total produzido, correto?
05/01/2016
Patrick
Vamos ver se eu entendi o que vc esta querendo fazer.
Bom, como tem total de sucessos e total de erros, esses valores seriam o total produzido, correto?
Exatamente, ou seja, em outras palavras a formula seria, total com sucesso * 100 / pelo total (da coluna total), então gostaria de saber como faço para fazer isso e assim mostrar
mais uma coluna no meu resultado, que ficaria: total_sucesso | total | porcentagem
Poderia me ajudar por favor?
05/01/2016
Patrick
Vamos ver se eu entendi o que vc esta querendo fazer.
Bom, como tem total de sucessos e total de erros, esses valores seriam o total produzido, correto?
Obs: O total produzido já o valor da coluna total_erro que eu alterei agora para total, tinha errado na descrição.
05/01/2016
Alex Lekao
basta vc adicionar mais uma coluna, somente com o calculo dos campos.
Exemplo:
((sum(total_sucesso)*100)/sum(total_erro)) as Porcentagem
acho que eh isso.
eu costumo colocar com os parenteses certinhos, para me certificar que a ordem de calculo seja feito conforme esperada, nao costumo deixar a cargo apenas da regra matematica. rsrsr
05/01/2016
Patrick
basta vc adicionar mais uma coluna, somente com o calculo dos campos.
Exemplo:
((sum(total_sucesso)*100)/sum(total_erro)) as Porcentagem
acho que eh isso.
eu costumo colocar com os parenteses certinhos, para me certificar que a ordem de calculo seja feito conforme esperada, nao costumo deixar a cargo apenas da regra matematica. rsrsr
Perfeito, foi, Muito obrigado Alex, me ajudou muito, Deus lhe abençoe, valeu iSAAC também, obrigado pessoal.
Clique aqui para fazer login e interagir na Comunidade :)