Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 541483
            [titulo] => Consulta SQL - Porcentagem
            [dataCadastro] => DateTime Object
                (
                    [date] => 2016-01-05 11:34:20
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 268754
            [status] => A
            [isExample] => 
            [NomeUsuario] => Alex Lekao
            [Apelido] => Alex - Lekao
            [Foto] => Alex-3.jpg
            [Conteudo] => 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.

[code]
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
[/code]

acho que seria isso. ) )

Consulta SQL - Porcentagem

Patrick
   - 04 jan 2016

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


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á

Post mais votado

Alex Lekao
   - 05 jan 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.

#Código

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.

Isaac Jose
   - 05 jan 2016

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

Patrick
   - 05 jan 2016


Citação:
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.

Alex Lekao
   - 05 jan 2016

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

Exemplo:

#Código

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

Patrick
   - 05 jan 2016


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

Exemplo:

#Código

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:

#Código
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?

Alex Lekao
   - 05 jan 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?

Citação:

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.

Patrick
   - 05 jan 2016


Citação:
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?

Citação:

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:

#Código

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?

Alex Lekao
   - 05 jan 2016

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

Exemplo:

#Código

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.

Patrick
   - 05 jan 2016


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

Exemplo:

#Código

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

#Código
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?

Patrick
   - 05 jan 2016


Citação:
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.

#Código

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?

Alex Lekao
   - 05 jan 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?

Patrick
   - 05 jan 2016


Citação:
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?

Patrick
   - 05 jan 2016


Citação:
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.

Alex Lekao
   - 05 jan 2016

o calculo pode ser feito do jeito que vc menciona.

basta vc adicionar mais uma coluna, somente com o calculo dos campos.

Exemplo:

Citação:

((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

Isaac Jose
   - 05 jan 2016

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

Patrick
   - 05 jan 2016


Citação:
o calculo pode ser feito do jeito que vc menciona.

basta vc adicionar mais uma coluna, somente com o calculo dos campos.

Exemplo:

Citação:

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

Alex Lekao
   - 05 jan 2016

fmz!!!

Tamoae.

precisar de algo eh so falar.

Abraco.

Isaac Jose
   - 05 jan 2016

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

Patrick
   - 05 jan 2016


Citação:
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.

Isaac Jose
   - 05 jan 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.

Patrick
   - 05 jan 2016


Citação:
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.