Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Estatística por filial e níveis


Teixeiraa

Pergunta

Olá.

Eu estou fazendo uma pesquisa no mysql, e selecionei exemplares que foram emprestados durante um certo período, filtrando por Filial e Níveis.

Os níveis ficam na tabela I

Os empréstimos na tabela P

E as informações do livro ficam na tabela N ( onde também tenho o id dos níveis)

Utilizei a seguinte query:

 
SELECT (SELECT COUNT(n.id_I =1)) AS  'A1', (SELECT COUNT(n.id_I =2)) AS  'A2', (SELECT COUNT(n.id_I=4)) AS  'B1', (SELECT COUNT(n.id_I =5)) AS  'B2'
FROM  P p
INNER JOIN  N n ON n.id = p.id
WHERE YEAR( p.datetime ) =  '2013'
AND MONTH( p.datetime ) =  '10'
AND p.local = 2
Pelo pouco que entendo o resultado deveria ser a contagem de empréstimos em cada nível, no período e na filial determinada.

Mas o resultado são valores iguais em cada nível.

Alguém pode me esclarecer porque isso acontece??

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Olá.

Eu estou fazendo uma pesquisa no mysql, e selecionei exemplares que foram emprestados durante um certo período, filtrando por Filial e Níveis.

Os níveis ficam na tabela I

Os empréstimos na tabela P

E as informações do livro ficam na tabela N ( onde também tenho o id dos níveis)

Utilizei a seguinte query:

 
SELECT (SELECT COUNT(n.id_I =1)) AS  'A1', (SELECT COUNT(n.id_I =2)) AS  'A2', (SELECT COUNT(n.id_I=4)) AS  'B1', (SELECT COUNT(n.id_I =5)) AS  'B2'
FROM  P p
INNER JOIN  N n ON n.id = p.id
WHERE YEAR( p.datetime ) =  '2013'
AND MONTH( p.datetime ) =  '10'
AND p.local = 2

Pelo pouco que entendo o resultado deveria ser a contagem de empréstimos em cada nível, no período e na filial determinada.

Mas o resultado são valores iguais em cada nível.

Alguém pode me esclarecer porque isso acontece??

O que você está querendo é chamado de pivot table. Para corrigir seu código faça assim:

SELECT ColoqueOCampoComNmeDaFilialAqui, SUM(IF(n.id_I=1,1,0)) AS  'A1', SUM(IF(n.id_I=2,1,0)) AS  'A2', SUM(IF(n.id_I=4,1,0)) AS  'B1', SUM(IF(n.id_I =5,1,5)) AS  'B2'
FROM  P p
INNER JOIN  N n ON n.id = p.id
WHERE (p.datetime BETWEEN '2013-10-01' AND '2013-10-31') AND p.local = 2
GROUP BY ColoqueOCampoComNmeDaFilialAqui
Link para o comentário
Compartilhar em outros sites

  • 0

Denis, pegando o onibus andando também, tava precisando de algo parecido para separar umas propostas que tenho por status, usando a procedure que você já me passou anteriormente e usando o exemplo dele ai, montei este select...

SELECT 
  b.nome AS nome_empresa,
  COUNT(IF(a.cod_status = 2,1,0)) AS 'ANALISE',
  COUNT(IF(a.cod_status = 3,1,0)) AS 'PENDENTE',
  COUNT(IF(a.cod_status = 4,1,0)) AS 'REPROVADA' 
FROM
  propostas_status a 
  JOIN propostas c ON (c.`cod_proposta` = a.`cod_proposta`)
  JOIN empresas_lojas b 
    ON b.`cod_loja` = c.`cod_loja` 
WHERE c.`cod_empresa` = 6
GROUP BY b.`cod_loja` 

no caso ai ele está mostrando nas 3 colunas o valor 2 ( possui 2 registros na tabela propostas_status, porém uma proposta o cod_status é 2 e a outra é cod_status = 3 )

Correto seria mostrar:

Empresa | ANALISE | PENDENTE | REPROVADA

Teste 1 | 1 | 1 | 0

O que coloquei errado nesse select?

Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, creio que as seguintes sintaxes apresentadas a cima: COUNT(n.id_I =1)) e SUM(IF(n.id_I=1,1,0)) não sejam válidas para o MySQL 5.1

Flechaus, concordo com a sintaxe COUNT(n.id_I =1)). Só com esta como incorreta.
Link para o comentário
Compartilhar em outros sites

  • 0

Denis, pegando o onibus andando também, tava precisando de algo parecido para separar umas propostas que tenho por status, usando a procedure que você já me passou anteriormente e usando o exemplo dele ai, montei este select...

SELECT 
  b.nome AS nome_empresa,
  COUNT(IF(a.cod_status = 2,1,0)) AS 'ANALISE',
  COUNT(IF(a.cod_status = 3,1,0)) AS 'PENDENTE',
  COUNT(IF(a.cod_status = 4,1,0)) AS 'REPROVADA' 
FROM
  propostas_status a 
  JOIN propostas c ON (c.`cod_proposta` = a.`cod_proposta`)
  JOIN empresas_lojas b 
    ON b.`cod_loja` = c.`cod_loja` 
WHERE c.`cod_empresa` = 6
GROUP BY b.`cod_loja` 
...

O que coloquei errado nesse select?

Nesta caso específico o campo do group by deve ser o primeiro do select.

Você meciona nome_empresa no select e cod_loja no group by.

Link para o comentário
Compartilhar em outros sites

  • 0

É que ao invés de mostrar o código da empresa eu to colocando para mostrar o nome da empresa...

Bom, mas fiz o teste aqui... alterei para cod_loja, mas mesmo assim não funcionou ele continua repetindo o valor para todas as colunas..

SELECT 
  b.`cod_loja`,
  COUNT(IF(a.cod_status = 2,1,0)) AS 'ANALISE',
  COUNT(IF(a.cod_status = 3,1,0)) AS 'PENDENTE',
  COUNT(IF(a.cod_status = 4,1,0)) AS 'REPROVADA' 
FROM
  propostas_status a 
  JOIN propostas c ON (c.`cod_proposta` = a.`cod_proposta`)
  JOIN empresas_lojas b 
    ON b.`cod_loja` = c.`cod_loja` 
WHERE c.`cod_empresa` = 6
GROUP BY b.`cod_loja` 

Denis, fiz uma alteração aqui retirei os coloquei com sub-select.. agora funcionou...

SELECT 
  b.`cod_loja`,
  (SELECT COUNT(cod_status) FROM propostas_status WHERE cod_status = 2 ) AS 'ANALISE',
  (SELECT COUNT(cod_status) FROM propostas_status WHERE cod_status = 3 ) AS 'PENDENTE',
  (SELECT COUNT(cod_status) FROM propostas_status WHERE cod_status = 4 ) AS 'REPROVADA',
  (SELECT COUNT(cod_status) FROM propostas_status WHERE cod_status = 5 ) AS 'APROVADA',
  (SELECT COUNT(cod_status) FROM propostas_status WHERE cod_status = 6 ) AS 'FATURADA'
FROM
  propostas_status a 
  JOIN propostas c ON (c.`cod_proposta` = a.`cod_proposta`)
  JOIN empresas_lojas b 
    ON b.`cod_loja` = c.`cod_loja` 
WHERE c.`cod_empresa` = 6
GROUP BY b.`cod_loja` 
Editado por crazySerk
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...