Consulta SQL - Porcentagem

SQL Server

04/01/2016

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

Patrick

Curtidas 0

Melhor post

Alex Lekao

Alex Lekao

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.
GOSTEI 1

Mais Respostas

Isaac Jose

Isaac Jose

04/01/2016

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

Patrick

04/01/2016

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.
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

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
GOSTEI 0
Patrick

Patrick

04/01/2016

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?
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

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.
GOSTEI 0
Patrick

Patrick

04/01/2016

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?
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

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.
GOSTEI 0
Patrick

Patrick

04/01/2016

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?
GOSTEI 0
Patrick

Patrick

04/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.



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?
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

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?
GOSTEI 0
Patrick

Patrick

04/01/2016

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?
GOSTEI 0
Patrick

Patrick

04/01/2016

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.
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

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
GOSTEI 1
Isaac Jose

Isaac Jose

04/01/2016

(Y 105/ X 214)*100 = 49%
GOSTEI 0
Patrick

Patrick

04/01/2016

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.
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

fmz!!!

Tamoae.

precisar de algo eh so falar.

Abraco.
GOSTEI 0
Isaac Jose

Isaac Jose

04/01/2016

Disponha. vc conseguiu resolver os outros que tinha? lekao conseguiu dar continuidade no seu?
GOSTEI 0
Patrick

Patrick

04/01/2016

Disponha. vc conseguiu resolver os outros que tinha? lekao conseguiu dar continuidade no seu?


O do calculo da média movel ainda não consegui, parei de mexer nele para ver esse, vou voltar a trabalhar nele quando meu user da empresa for liberado para criação de functions, pois pelo que vi, só será possivel através delas.
GOSTEI 0
Isaac Jose

Isaac Jose

04/01/2016

e precisa pois tem que verificar o intervalo de dias sobre um período com verificação de feriados e etc. a única maneira que consegui fazer foi assim... mais nunca parei pra pensar se da pra fazer de outra forma kkkk.
GOSTEI 0
Patrick

Patrick

04/01/2016

e precisa pois tem que verificar o intervalo de dias sobre um período com verificação de feriados e etc. a única maneira que consegui fazer foi assim... mais nunca parei pra pensar se da pra fazer de outra forma kkkk.


Bom, a parte de feriados não é importante, já que posso receber remessas dias de feriados e sabados e domingos, o importante é calcular dinamicamente apartir das datas que vai ter na tabela, ou seja, as datas de registro.
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

Tinha mais coisa?

nao percebi no post. rsrsr

foi mal. rsrsrsrsr

agora, eu uso um select para calcular dias uteis, sem utilizar funcoes, achei melhor assim, que o pessoal do ERP fica meio bolado qdo cria coisa a mais no banco que faca alguns "milagres". rsrsr

Disponha. vc conseguiu resolver os outros que tinha? lekao conseguiu dar continuidade no seu?
GOSTEI 0
Patrick

Patrick

04/01/2016

Tinha mais coisa?

nao percebi no post. rsrsr

foi mal. rsrsrsrsr

agora, eu uso um select para calcular dias uteis, sem utilizar funcoes, achei melhor assim, que o pessoal do ERP fica meio bolado qdo cria coisa a mais no banco que faca alguns "milagres". rsrsr

Disponha. vc conseguiu resolver os outros que tinha? lekao conseguiu dar continuidade no seu?


Ter coisa tem, porém era assunto de outro post, enfim, explicando aqui, eu precisava criar uma query ou function, que retornasse baseado no valor que eu colocasse de dias, as médias moveis das minhas vendas, tipo bolsa de valores, e como não sou nenhum DBA, e nunca fiz, estou quebrando a cabeça pra fazer hahaa
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

ah ta, entendi.

bom, especificamente isso eu nunca montei.

qqr coisa, depois se eu achar o post tento acompanhar, para ver se consigo ajudar com algo. rsrsr
GOSTEI 0
Patrick

Patrick

04/01/2016

ah ta, entendi.

bom, especificamente isso eu nunca montei.

qqr coisa, depois se eu achar o post tento acompanhar, para ver se consigo ajudar com algo. rsrsr


Segue o Link, se puder ajudar, fico muito agradecido: https://www.devmedia.com.br/forum/fazer-calculo-da-media-movel-com-datas/540809
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

blz.

vou dar uma olhada.

vou ter que entender primeiro o que eh essa media movel. rsrsr

mas qqr coisa la eu vejo e faco mais questionamentos. rsrsr
GOSTEI 0
Patrick

Patrick

04/01/2016

blz.

vou dar uma olhada.

vou ter que entender primeiro o que eh essa media movel. rsrsr

mas qqr coisa la eu vejo e faco mais questionamentos. rsrsr



Links sobre média movel: http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages

http://br.advfn.com/educacional/analise-tecnica/media-movel-simples

resumindo, é um grafico que a bolsa de valores usa...
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

entendi.

cara, para mim nao da. rsrsr
GOSTEI 0
Isaac Jose

Isaac Jose

04/01/2016

Kkkk claro que da começa a fazer .quando estiver fazendo relatórios no report fazemos uns desses kk
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

opa...

com certeza!!!

mas to querendo comecar com o feijao com arroz primeiro.

kkkkkk

mas eu gostei da ideia de media movel e tal, qdo apresentar algo desse tipo pro chefe ele com certeza vai gostar. rsrsr
GOSTEI 0
Patrick

Patrick

04/01/2016

Bom, se vocês com um nivel maior que eu estão achando meio dificil, imagina pra mim HEUEHUEHE, porém irei tentar e ver o que acontece! HUEHE
GOSTEI 0
Isaac Jose

Isaac Jose

04/01/2016

Não é difícil tenho uns 100 relatórios q fazem isso kkkk
GOSTEI 0
Alex Lekao

Alex Lekao

04/01/2016

no meu caso, eu preciso de mais tempo para entender o conceitual.

depois que conseguir entender(que eh o mais dificil. rsrsrs) eu vou de boa. kkkkkk
GOSTEI 0
POSTAR