Série da semana: Primeiros passos no React

Veja mais

Consulta SQL - Porcentagem

04/01/2016

8

Olá galera, é o seguinte, tenho uma consulta que retorna a porcentagem, ela está dessa forma a query


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á
Responder

Post mais votado

05/01/2016

com um sum normal.

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.
Responder

Mais Posts

05/01/2016

Isaac Jose

bom dia.
primeiro faça um select agrupando X e Y depois faça outro para obter o percentual.
Responder

05/01/2016

Patrick

bom dia.
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.
Responder

05/01/2016

Alex Lekao

acredito que ele esteja se referindo em vc montar o select dentro do outro fazendo as operacoes separadas.

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
Responder

05/01/2016

Patrick

acredito que ele esteja se referindo em vc montar o select dentro do outro fazendo as operacoes separadas.

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?
Responder

05/01/2016

Alex Lekao

Bom, nesse caso o erro eh devido a subselect estar retornando mais de um valor, isso pode ser por causa do group by.

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.
Responder

05/01/2016

Patrick

Bom, nesse caso o erro eh devido a subselect estar retornando mais de um valor, isso pode ser por causa do group by.

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?
Responder

05/01/2016

Alex Lekao

basicamente, vc tera que montar o novo select onde sera feito os calculos que vc deseja.

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.
Responder

05/01/2016

Patrick

basicamente, vc tera que montar o novo select onde sera feito os calculos que vc deseja.

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?
Responder

05/01/2016

Patrick

com um sum normal.

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?
Responder

05/01/2016

Alex Lekao

Bom, primeiro precisaria saber o que em relacao ao que vc quer calcular.

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?
Responder

05/01/2016

Patrick

Bom, primeiro precisaria saber o que em relacao ao que vc quer calcular.

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?
Responder

05/01/2016

Patrick

Bom, primeiro precisaria saber o que em relacao ao que vc quer calcular.

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.
Responder

05/01/2016

Alex Lekao

o calculo pode ser feito do jeito que vc menciona.

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
Responder

05/01/2016

Isaac Jose

(Y 105/ X 214)*100 = 49%
Responder

05/01/2016

Patrick

o calculo pode ser feito do jeito que vc menciona.

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.
Responder