Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Saguinte,
no banco cadastro alguns erros. E depois quero mostrá-los separadamento.
Ex:
Estrutura do Banco:
LOCAL Erros
barra erro 1
barra av; erro 1
Caxias erro 2
Leblon erro 3
ipanema erro 4
Só que na hora do select, o ideia é que saísse assim:
LOCAL erros 1 erro2 erro3 erro4
barra 2 1 4 1
barra av; 2 1 4 1
Caxias 2 1 4 1
Leblon 2 1 4 1
ipanema 2 1 4 1
Esse numeros acima são a quantidade de erros de acordo com o que fora cadastrado pelo usuario.
Ex:
na primeira linha, temos:
LOCAL erros 1 erro2 erro3 erro4
barra 2 1 4 1
onde na barra, quantidade de erro1 forma2, de erro 2 foi 1 e assim sucessivamente.
bom, tentei exemplicar... deixar a explicação o mais simples possível.
Agora, vou postar um exemplo real de onde consegui chegar, de acordo com o pouco que conheço.
SELECT motivo_resultado, count(motivo_resultado) AS folha FROM tb_resultado_pistolagem
WHERE motivo_resultado='erro1'
GROUP BY motivo_resultado
Alguém poderia dá uma forcinha..? Tentei um SELECT duplo, mas não funcionou.
O SUM utilizao, qué para realizar operação de adição, certo?
Group By utilizo também, só que tem alguma coisa que não está dando certo.
CASE não sei como fazer isso. Na verdade não cheguei a utilizá-lo.
Mas vou vê-lo.
http://www.devmedia.com.br/utilizando-pivot-table/4565
O CASE permite fazer o PIVOT da operaçao.
Showw!!
Vou dar uma olhada e posto o resultado.
abç
Montei algo do tipo:
SELECT
nome_marca_resultado,
COUNT(CASE WHEN (nome_marca_resultado='Outras Despesas') THEN 1 ELSE 0 END) AS'Folha de Outras Despesas',
COUNT(CASE WHEN (nome_marca_resultado='não Preenchida' AND nome_marca_resultado=1) THEN 1 ELSE 0 END) AS 'Guia não Preenchida'
FROM
tb_resultado
GROUP BY
nome_marca_resultado
**************************************************************************************************
Estou vendo esse CASE e o PIVOT agora. Portanto, estou estudando-os ainda.
Consegui mostrar uma parte.
Mas por exemplo, quando quero mostrar "Não Preenchida", repete a primeira coluna.
Não entendi.
Utilizei este site para compreender melhor:
http://stackoverflow.com/questions/1241178/mysql-rows-to-columns
Só que não entendi uma coisa. Como mostrar os dados de que preciso em coluna.
Tipo, no banco a gente salva e fica assim assim:
BAIRROS ERROS
Bairro botafogo Não preenchido
Bairro caxias Sem Guia
Bairro flamengo Não preenchido
A ideia é fazer uma contagem dos erros e nomear as colunas de acordo com o "erro" aprensetando, portanto como no exemplo baixo:
BAIRROS Não preenchido Sem Guia
Bairro botafogo 1
Bairro caxias 1 1
Bairro flamengo 1
Eu tinha conseguindo assim:
SELECT resultado, count(resultado) AS folha FROM tb_resultado
WHERE motivo_resultado='Outras Despesas'
GROUP BY resultado
Ainda não consegui preender bem o CASE.
Motta, utilizei este codigo:
SELECT nome_resultado,
CASE WHEN mot_resultado = 'Outras Despesas' THEN motivo_resultado ELSE 0 END AS 'Outras Despesas',
CASE WHEN mot_resultado = 'não Preenchida' THEN motivo_resultado ELSE 0 END AS 'Não Preenchida',
CASE WHEN mot_resultado = 'Etiqueta' THEN motivo_resultado ELSE 0 END AS 'Etiqueta'
FROM tb_resultado
parece que agora funcionou um parte. Para "fechar", tentei utilizar o COUNT. Porém ao utilizá-lo, as colunas se repetem quando tento agrupar pelo bairro.
Tentando explicar de uma maneira mais clara, existem erros que se repetem para uma mesma unidade.
Ex:
BAIRROS ERROS
Bairro botafogo Não preenchido
Bairro botafogo Não preenchido
Bairro botafogo Não preenchido
Bairro botafogo Não preenchido
Estou tentando agrurpar pelo campo "BAIRROS" para que o resultado fico como abaixo:
BAIRROS Não preenchido
Bairro botafogo 4
Porém quando insiro o COUNT, o resultado é assim:
BAIRROS Não preenchido Não preenchido
Bairro botafogo 4 4
Como estou tentando fazer com que apareçam dois campos, o campo 1 se reflete ao campo 2.
Conseguiu compreender(rs)?
SELECT nome_resultado,
SUM(CASE WHEN mot_resultado = 'Outras Despesas' THEN motivo_resultado ELSE 0 END) AS 'Outras Despesas',
SUM(CASE WHEN mot_resultado = 'não Preenchida' THEN motivo_resultado ELSE 0 END) AS 'Não Preenchida',
SUM(CASE WHEN mot_resultado = 'Etiqueta' THEN motivo_resultado ELSE 0 END) AS 'Etiqueta'
FROM tb_resultado
GROUP BY NOME_RESULTADO
Opa|!
Vlw pela dica.
Bom, seguinte, quando utilizo o código que vc postou acima, os resultados aparecem zerados.
Mas quandno eu tiro o SUM e insiro o COUNT, aparece o total do bairro daquele bairro.
Vide o código:
SELECT nome_resultado,
CASE WHEN motivo_resultado = 'Outras Despesas' THEN count(motivo_resultado) ELSE 0 END AS 'Outras Despesas',
CASE WHEN motivo_resultado = 'nao Preenchida' THEN count(motivo_resultado) ELSE 0 END AS 'nao Preenchida',
CASE WHEN motivo_resultado = 'Etiqueta' THEN count(motivo_resultado) ELSE 0 END AS 'Etiqueta'
FROM tb_resultado
GROUP BY nome_resultado
Consegui fazer da maneira acima. Só que o ruim é que aparece o total do total.
Por exemplo:
se existem 5 erros de um mesmo bairro. 3 erros são de "não preenchidas"; 2 erros são de "rasuradas". Totalizando, portando, 4.
O interessante é mostrar 2 de cada.
BAIRROS Não preenchido Rasuradas
Bairro botafogo 3 2
Só que mostra assim:
BAIRROS Não preenchido Rasuradas
Bairro botafogo 5 0
Acredito que agora é uma questão de detalhe que não estou conseguindo enxergar.
Sinceramente, agora a mente deu uma "parada"...rsrs tentando pensar...
Pega o
SELECT nome_resultado,
CASE WHEN motivo_resultado = 'Outras Despesas' THEN count(motivo_resultado) ELSE 0 END AS 'Outras Despesas',
CASE WHEN motivo_resultado = 'nao Preenchida' THEN count(motivo_resultado) ELSE 0 END AS 'nao Preenchida',
CASE WHEN motivo_resultado = 'Etiqueta' THEN count(motivo_resultado) ELSE 0 END AS 'Etiqueta'
FROM tb_resultado
GROUP BY nome_resultado
trasforma em subquery e retira o que vc nao quer.
giesta,agradeço pelo contato.
Tranformar em subquery quer dizer criar um outro SELECT ??
Seriam 2 (dois) SELECTs?
Outra: nao entendi muito "retira o que você nao quer". Sendo que, na verdade, preciso acrescentar mais informação.
Tendeu......?
Desculpe Carlos, entendi errado seu post.
Verifique o primeiro link que o Motta colocou. La tem 2 exemplos funcionais.
De qualquer maneira, vc sempre vai ter q usar o sum , se vc usar o count, ele "ativa a regra" e conta todas as linhas para a regra. Idealmente mesmo é marretar 1 e 0 e depois dar sum
Mais info:
http://stackoverflow.com/questions/5045124/count-case-and-when-statement-in-mysql
giesta, agradeço pelo feedback.
Quando utilizo o SUM, os valores aparecem zerados em todas as colunas.
Não estendi muito (rs) tua frase: " Idealmente mesmo é marretar 1 e 0".
Entendo o básico do básico de banco de dados.
Já estou olhando o link que você postou. Só não entendo porque o sum aparece com valor zerado.
Entao Carlos, se você tem linhas e quer transformar em campos, ou seja uma consulta pivot, você pode marretar, e ao marretar você entende bem melhor o q esta fazendo e o que esta acontecenco.
ou seja
select local,
if( erros = erro1,1,0) as erro1,
if( erros = erro2,1,0) as erro2,
if( erros = erro3,1,0) as erro3,
if( erros = erro4,1,0) as erro4
from tabela
desta maneira você processou o campo "erros" 4 vezes e o transformou com 4 campos distintos, que só retorna "1" quando a linha possui o valor correto para o campo "erros" e zero quando possui valor distinto.
Esse é o primeiro passo.
Se você para aqui você tem o seguinte conjunto de dados partindo do exemplo incial
LOCAL-Erro1-Erro2-Erro3-Erro4
barra-1-0-0-0
barra av-1-0-0-0
Caxias-0-1-0-0
Leblon-0-0-1-0
ipanema-0-0-0-1
depois você pode pegar esse conjunto de dados e tratar com uma tabela, ou seja subquery. ou pode plicar funcoes de agregacao nesse conjunto de dados
select local,
sum(erro1) as total_erro1,
sum(erro2) as total_erro2
sum(erro3) as total_erro3
sum(erro4) as total_erro4
from
(
select local,
if( erros = erro1,1,0) as erro1,
if( erros = erro2,1,0) as erro2,
if( erros = erro3,1,0) as erro3,
if( erros = erro4,1,0) as erro4
from tabela
) as z
group by local
o mesmo pode ser feito diretamente com case em apenas um passo, mas é necessário ter mais cuidado
giesta, vlw pela "Aula"...rsrs
Vou tentar aplicar esse teu ensino ao que estou tentando desenvolver. Acho q tua explicação ficou bem clara.
Assim que eu obtiver algum resultado, seja ele positivo ou negativo(acredito positivo), voltarei aqui para postar.
No mais..
agradeço bastante pela atenção.
abç
Estudei o teu código.
Tentei aplicar, mas os valores aparecem zerados.
Veja como ficou:
SELECT nome_marca_resultado,
sum('Folha de Outras Despesas') as erro1,
sum('Guia não Preenchida') as erro2
FROM
(
SELECT nome_marca_resultado,
if (motivo_resultado = 'Folha de Outras Despesas', 1,0 ) as erro1,
if (motivo_resultado = 'Guia não Preenchida', 1, 0) as erro2
FROM tb_resultado_pistolagem
) as z
GROUP BY nome_marca_resultado
******************************************************************************************
OBS: quando utilizo o COUNT ele exibe valores.. mas esses valores são os totais, como vc explicara no post anterior.
Já com o SUM, nada aparede; tudo zero (0);
também tentei utilizar este cóigo:
SELECT nome_marca_resultado,
CASE WHEN motivo_resultado = 'Folha de Outras Despesas' THEN count(motivo_resultado) ELSE 0 END AS 'Folha de Outras Despesas',
CASE WHEN motivo_resultado = 'Guia não Preenchida' THEN count(motivo_resultado) ELSE 0 END AS 'Guia não Preenchida'
FROM tb_resultado_pistolagem
GROUP BY nome_marca_resultado
Mas ele não exibe todos os valores. Estou quebrando a cabeça nisso já tem quase dois dias...rs
Imprimi até o teu código pra estudá-lo melhor..
Se com esses códigos dos quais postei, tu pouder me ajudar ainda...
showww!!
E para melhor compreensão, utilizo este código com o SUM:
SELECT nome_marca_resultado,
CASE WHEN motivo_resultado = 'Folha de Outras Despesas' THEN SUM(motivo_resultado) ELSE 0 END AS 'Folha de Outras Despesas',
CASE WHEN motivo_resultado = 'Guia não Preenchida' THEN SUM(motivo_resultado) ELSE 0 END AS 'Guia não Preenchida'
FROM tb_resultado_pistolagem
GROUP BY nome_marca_resultado
Porém os valores aparecem com valor ZERO (0).
Vc nomeou os campos como erro1 e erro2, logo eles devem participar do sum.
SELECT nome_marca_resultado,
sum(erro1) as erro1,
sum(erro2) as erro2
FROM
(
SELECT nome_marca_resultado,
if (motivo_resultado = 'Folha de Outras Despesas', 1,0 ) as erro1,
if (motivo_resultado = 'Guia não Preenchida', 1, 0) as erro2
FROM tb_resultado_pistolagem
) as z
GROUP BY nome_marca_resultado
Giesta, Sensacional!!! Simplesmente Fantástico!! Conseguimos!!
Agradeço pelo aula, paciência e empenho. É até complicado encontrar palavras para agradecer..rs
Uma coisa...
tá funcionando da forma que queria.
só uma dúvida...sem querer pedir de mais...só para complementar essa imensa ajuda.
eu tentei aqui, mas não deu certo.
Se eu quiser obter o total daquela coluna, como poderia ser feito?
OBS: ajuda sensacional!!
Legal Carlos, depois marca o post que mais te ajudou como "Resolvido" para ajudar outros usuarios no futuro.
Quanto a sua pergunta...
use with rollup
http://dev.mysql.com/doc/refman/5.7/en/group-by-modifiers.html
http://imasters.com.br/artigo/13271/mysql/agrupamento-parcial-com-with-rollup-no-mysql/
SELECT ifnull(nome_marca_resultado,'Total'),
sum(erro1) as erro1,
sum(erro2) as erro2
FROM
(
SELECT nome_marca_resultado,
if (motivo_resultado = 'Folha de Outras Despesas', 1,0 ) as erro1,
if (motivo_resultado = 'Guia não Preenchida', 1, 0) as erro2
FROM tb_resultado_pistolagem
) as z
GROUP BY nome_marca_resultado
with rollup
Giesta, desculpe-me não ter respondido antes. Fiquei meio fora do mundo digital?rs
Mas vou tentar a tua última dica agora mesmo.
E "posto" resultado.
abç
Mano Giesta, Funcionou!!!
Este é o tópico:
#22 /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_images/imasters-2014/icon_share.png&key=9d0d421ab42a94719e7f3052c90d1d45557df1c6f07031cc5b82c8378afa46e6" title="Como mostrar a quantidade de arquivos repetidos e criar uma nova Colun: post #22" alt="icon_share.png" />giesta
Este é o código que resolveu todo o problema:
SELECT ifnull(nome_marca_resultado,'Total'),
sum(erro1) as erro1,
sum(erro2) as erro2
FROM
(
SELECT nome_marca_resultado,
if (motivo_resultado = 'Folha de Outras Despesas', 1,0 ) as erro1,
if (motivo_resultado = 'Guia não Preenchida', 1, 0) as erro2
FROM tb_resultado_pistolagem
) as z
GROUP BY nome_marca_resultado
with rollup
Giesta, ajuda tua foi completamente fundamental, essencial.. Você não faz ideia dos imensos galhos que quebrou.
Deus te abençoe cada vez mais!
SUM , CASE e GROUP BY.
http://forum.imasters.com.br/topic/406792-resolvidosum-case/