Jump to content
Anderson Campos da Silva

[Resolvido] Select com group by

Recommended Posts

Olá,

 

Estou com um problema, que para alguns pode ser simples, é o seguinte:

 

Tenho 2 tabela relacionadas, MODELO e EQUIPAMENTO

 

TABELA MODELO

idModelo (INT) - chave primária  

txModelo (VARCHAR)

 

TABELA EQUIPAMENTO 

idEquipamento (INT) - chave primária   

patrimonio (VARCHAR)

situacao (VARCHAR)

idModelo (INT) - Chave estrangeira

 

O campo situação pode ser preenchido apenas apenas com PRODUÇÃO OU ESTOQUE.

 

Enfim, preciso de um SELECT que retorne as seguintes colunas txModelo, quantidade de equipamentos por modelo, quantidade de equipamentos com PRODUÇÃO, e quantidade de equipamentos com ESTOQUE, exemplo:

 

txModelo | total | produção | estoque

CISCO           7            4                  3

HP                15          10                 5

DELL            10           2                   8

 

Desde já agradeço

Share this post


Link to post
Share on other sites
2 horas atrás, Motta disse:

Veja se isto ajuda , talvez se precise de um join.

Opa, obrigado pela ajuda, porém, as linhas ficaram duplicadas:

 

QUERY:

 

SELECT txModelo, count(equipamento.idModelo) AS TOTAL,

CASE WHEN situacao='EM ESTOQUE' then count(situacao) else 0 end AS 'ESTOQUE', 
CASE WHEN situacao='EM PRODUÇÃO' then count(situacao) else 0 end AS 'PRODUÇÃO' 

FROM modelo LEFT JOIN equipamento ON modelo.idModelo = equipamento.idModelo 

GROUP BY descModelo, situacao

 

Retornou assim:

 

txModelo | total | produção | estoque

CISCO           4            4                  0

CISCO           3            0                  3

HP                10          10                 0

HP                 5            0                  5

DELL             2            2                   0

DELL             8            0                   8

Share this post


Link to post
Share on other sites
SELECT txModelo, count(equipamento.idModelo) AS TOTAL,
CASE WHEN situacao='EM ESTOQUE' then count(situacao) else 0 end AS 'ESTOQUE', 
CASE WHEN situacao='EM PRODUÇÃO' then count(situacao) else 0 end AS 'PRODUÇÃO' 
FROM modelo LEFT JOIN equipamento ON modelo.idModelo = equipamento.idModelo 
GROUP BY txModelo

 

Share this post


Link to post
Share on other sites
8 minutos atrás, Motta disse:

SELECT txModelo, count(equipamento.idModelo) AS TOTAL,
CASE WHEN situacao='EM ESTOQUE' then count(situacao) else 0 end AS 'ESTOQUE', 
CASE WHEN situacao='EM PRODUÇÃO' then count(situacao) else 0 end AS 'PRODUÇÃO' 
FROM modelo LEFT JOIN equipamento ON modelo.idModelo = equipamento.idModelo 
GROUP BY txModelo

 

Error Code: 1055. Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'asr.equipamento.situacao' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

 

Só funciona se eu adicionar situação na cláusula GROUP BY
 

Share this post


Link to post
Share on other sites

Com CASE dava erro se não colocasse situacao na cláusula group by , mas com IF funcionou

 

SELECT txModelo, count(equipamento.idModelo) AS TOTAL,

COUNT(IF( situacao='EM ESTOQUE', situacao, null)) AS ESTOQUE,
COUNT(IF( situacao='EM PRODUÇÃO', situacao, null)) AS PRODUCAO

FROM modelo LEFT JOIN equipamento ON modelo.idModelo = equipamento.idModelo 

GROUP BY txModelo

 

Obrigado!!!
 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By nathicoelhoo
      Tenho um cadastro de cliente e no cadastro é selecionado o sexo e o estado, por exemplo. Na área de edição, preciso puxar esses dados JÁ SELECIONADOS para um combobox. Tentei fazer com foreach porém não funcionou. Alguém pode me ajudar?
      <div class="form-group col-md-5" > <label for="inputSexo">Sexo</label> <select name="sexo_cliente" id="sexo_cliente" class="form-control" disabled> <option selected disabled="">Sexo</option> <?php require_once "api/conexao.php"; try { $prepared3 = $conexao_pdo->prepare("select * from sexo"); $prepared3->execute(); $result3 = $prepared3->fetchAll(); foreach($result3 as $resultado3) { echo "<option value='". $resultado3["cod"] ."'>". $resultado3["sexo"] ."</option>"; } } catch (PDOException $e) { echo "<option></option>"; } ?> </select> </div>  
    • By Ygor Guedes
      Boa tarde meu pessoal. Preciso da ajuda de vocês em uma consulta baseada em Inner Join + Group By. Irei deixar as tabelas e a consulta que eu tenho, para melhor visualização:
       
      Consulta: 
      SELECT tab_garagens.onibus_ponto, tab_garagens.onibus_prefixo, data FROM pontos INNER JOIN tab_garagens ON pontos.onibus_ponto = tab_garagens.onibus_ponto Tabela pontos:
      | onibus_ponto |                data                |
      |           10           |  2019-06-03 12:00:00 |
      |           10           |  2019-06-03 12:10:00 |
      |           44           |  2019-06-03 12:00:00 |
       
      Tabela tab_garagens:
      | onibus_ponto |  onibus_prefixo  |
      |           10           |      DE700            |
      |           44           |      GL030            |
       
      A minha consulta está trazendo a informação mais antiga da data; o que eu preciso é tipo um ORDER BY com data mais recente, onde eu pego a data mais atual do registro agrupado na coluna 'onibus_ponto'.
       
      Eu gostaria que saísse assim: 
       
      | onibus_ponto |  onibus_prefixo |             data                  |
      |        10              |       DE700          | 2019-06-03 12:10:00 |
      |        44              |       GL030          | 2019-06-03 12:00:00 |
       
      Se puderem me ajudar, fico agradecido
    • By peterstefan
      estou tentando fazer uma select no laravel para quando eu atualizar o e-mail do usuário mais se já existir no banco mostrar uma mensagem avisando que já existe no banco, mais não to conseguindo..
      Dei uma pesquisada e não achei nada que pudesse ajudar..
       
      $email = DB::select(DB::raw('SELECT id, email FROM users WHERE email=:email AND id !=:id'), ['email' => $request->email, 'id' => Auth::user()->id]); if ($email) { $json['message'] = $this->message->error("Ooops, " . Auth::user()->name . " E-mail já está em uso!")->reder(); return response()->json($json); }
    • By SACI1978
      Olá pessoal preciso de uma ajuda com esse código, era pra ele alterar a cor da minha resposta do banco, mas nada acontece:

       
      $listagem = $pdo->prepare("SELECT * FROM agendamento WHERE status!='PRONTO' AND status!='BAIXA' ORDER BY controle DESC"); $listagem->execute(); while ($lista = $listagem->fetch(PDO::FETCH_ASSOC)) { if($lista['status'] == "RECEBIDO"){ echo '<span style="color:red">' .$lista['status']. '</span>'; } if($lista['status'] != "EM ATENDIMENTO"){ echo '<span style="color:green">' .$lista['status']. '</span>'; } if($lista['status'] != "AGUARDANDO"){ echo '<span style="color:blue">' .$lista['status']. '</span>'; } }  
    • By eduardohaag
      Olá pessoal,
      Estou trabalhando em um projeto de estudo onde tenho uma tabela onde possui o cadastro de funcionários e a empresa onde trabalha.
      Preciso criar uma query que retorne o nome da empresa que possui a menor quantidade de funcionários.
      Tenho em minha mente que parece uma coisa simples, possivelmente utilizando as funções Count e MIN, mas não estou conseguindo chegar a um raciocino pra chegar nessa condição.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.