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 Kliemann
      Opa pessoal, peço desculpas se a pergunta for tosca, ou o código não ter sentido.
       
      Estou começando no PHP e estou com uma duvida de um menu de select.
       
       
      Segue o código.
      <select name="setor"> <?php $link = new mysqli('localhost','root','','db_chamados'); $result_setor= "SELECT id_setor,nome_setor FROM tb_setores"; $resultado_setor = mysqli_query($conn,$result_setor); while($row_setores = mysqli_fetch_assoc($resultado_setor)) ?> <option value="<?php echo $row_setores['id_setor']; ?>"> <?php echo $row_setores['nome_setor']; ?> </option> ?> </select> Alguem consegue me ajudar sobre? ele abre a janela mas não puxa os dados do meu banco.
    • By phtisp
      Criei este exemplo para teste.
      Preciso fazer o seguinte select:
       
      Preciso que ele faça uma validação do campo Nota, caso seja > 5 retone = APROVADO 
      caso seja = 5 REFORÇO
      caso seja < 5 REPROVADO
    • 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); }
×

Important Information

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