Ir ao conteúdo
  • Cadastre-se

Criar 3 Colunas e cada valor saindo de uma mesma coluna


Posts recomendados

Boa noite, estou tentando fazer um relatório no Access 2013 e não estou conseguindo.

 

Este Código esta funcionando, porém onde tem a coluna Count(txtProd.Status) AS OK, esta contando a quantidade de serviços com Status "Concluída", 

preciso de mais uma coluna que vou colocar como Improdutiva que tem os Status "Não Concluída" E "Suspensa"

e mais uma coluna de Serviço Pendente Status "Não Iniciada"

e mais uma de serviço Cancelado com Status "Cancelada"

 

Quando eu tento fazer as outras colunas ele assume os mesmos números.

 

SELECT txtProd.[Data Agendada para Execução] AS Data, txtSup.Supervisor, txtProd.Recurso, Count(txtProd.Status) AS OKFROM txtSup INNER JOIN txtProd ON txtSup.Tecnico = txtProd.Recurso WHERE (((txtProd.Status) Like "Concluída"))GROUP BY txtProd.[Data Agendada para Execução], txtSup.Supervisor, txtProd.RecursoHAVING (((txtProd.[Data Agendada para Execução])="01/02/15"));
Link para o comentário
Compartilhar em outros sites

  • Moderador

@carecazn

 

Já considerou a segunda norma formal para banco de dados?

Crie uma tabela chamada status, com todas as etapas e na sua tabela principal você resgata o valor através de uma chave estrangeira.

 

Com isso você elimina as colunas deixando apenas uma" status"  Pelo que eu entendi você está criando uma coluna para cada etapa e verifica com o texto escrito. ( isso é uma péssima prática)

Mas ainda não captei o real problema. se você postar um print mostrando o erro é mais fácil de entender

Link para o comentário
Compartilhar em outros sites

Amanhã vou postal uma imagem, vou tentar explicar melhor.

 

Tenho 2 Tabelas onde 1 tem o Nome do Supervisor x Nome do Técnico e a outra tem o Nome do Técnico e o Status dos serviços que ele fez no dia.

 

Exemplo:

 

Fabio Moreira - Fiz 3 Serviços Concluídos - 4 Serviços Não Concluídos e tenho mais 2 Pendentes

 

Tudo isso em uma tabela com os Status 1 embaixo do outros em linhas então eles vão aparecer assim:

 

NOME RECURSO - STATUS

Fabio Moreira       - CONCLUIDO

Fabio Moreira       - CONCLUIDO

Fabio Moreira       - CONCLUIDO

Fabio Moreira       - NÃO CONCLUIDO

Fabio Moreira       - NÃO CONCLUIDO

Fabio Moreira       - NÃO CONCLUIDO

Fabio Moreira       - NÃO CONCLUIDO

Fabio Moreira       - NÃO INICIADO

Fabio Moreira       - INICIADO

 

Dessa forma, e eu quero que fique assim

 

NOME DO RECURSO - OK - IMPRODUTIVO - PENDENTE

Fabio Moreira              - 3    -           4            -         2

 

O Status na tabela é uma única coluna que aparece todos os Status e quando eu coloco o código no Access 2013 ele aparece assim:

 

NOME DO RECURSO - OK - IMPRODUTIVO - PENDENTE

Fabio Moreira              - 3    -           3            -         3

Fabio Moreira              - 4    -           4            -         4

Fabio Moreira              - 2    -           2            -         2

 

Caso tenha como fazer outra tabela assim:

 

CONCLUIDA = 1

NÃO CONCLUIDA = 2

SUSPENSA = 3

NÃO INICIADA = 4

INICIADA = 5

CANCELADA = 6

 

Pode ser assim, converter cada situação para o número de referencia e todas vez que ele achar o número correspondente ele conta 1, eu não sai fazer mas se houver como pode ser assim também.


Todas as planilhas são externas, e eu estou tentando as manipular dentro do access, então elas vem como texto e todos os campos são de texto. 

Link para o comentário
Compartilhar em outros sites

  • Moderador

Não vou dizer para você abandonar o access... embora eu considere ele uma péssima ferramenta para banco de dados.

 

Acredito que agora eu meio que entendi o que você quis dizer.

 

Você fazer um balanço com  uma contagem de serviços de uma pessoa em específico para um relatório

 

Você terá uma tabela só para o status e outras duas que você já tem...

 

Basicamente você faz uma relação de 1:N da tabela status com a tabela principal.

 

No caso, aproveitando seu código, você acrescenta mais uma linha de INNER JOIN  para a tabela do status.

Faz a contagem para tudo e agrupa pelo nome.

 

Veja esse exemplo que fiz : http://sqlfiddle.com/#!9/81f97/6/0

Link para o comentário
Compartilhar em outros sites

DIF, da uma olhada agora http://sqlfiddle.com/#!9/d3108/4,tem algum site que da pra simular INNER JOIN também?


DIF, nós recebemos os relatórios com arquivos .csv eu estou usando o access porque os nossos relatórios vem do access, mas se tiver como utilizar outra ferramenta que dê pra mim exportar para Excel, pra mim pode ser também, estou aprendendo agora então pra mim tanto faz.

 

No access, eu pego o arquivo .csv e importo eles para o access e ele já fica um na sequência do outro, todas as ferramentas funcionam iguais? Não tenho muita experiência com linhas de comando, pra mim é tudo novo, em termos, porque eu criei um site com PHP e Java script, mas o conhecimento veio 100% do You tube, assisti vários videos de Criando site do zero, e consegui pegar uma coisa de um outra de outro e fiz o site, não estou mais mexendo com ele por falta de tempo, mas o MySQL vou ter mais tempo porque eu manipulo os arquivos em Excel e agora vou manipular como banco de dados, vou armazenar todos na minha maquina e quando eu precisar de algum relatório vai ficar mais fácil visto que o Excel demora uma vida quando manipulamos muitos dados.


Dif, consegui reproduzir o que esta acontecendo aqui, este mesmo site da pra simular as 2 tabelas.

 

http://sqlfiddle.com/#!9/c639f/10

 

Olha como ficou, é exatamente o que acontece aqui e quando tento colocar as Não Concluída ao lado das Concluídas ele faz 2 linhas com os mesmo valores exatamente como esta no link acima, faz 2 colunas com as Concluídas e a baixo 2 colunas com as Não Concluídas.


CREATE TABLE txtSup(id int(11) AUTO_INCREMENT,nomeS varchar(30) NOT NULL,nomeT varchar(30) NOT NULL,PRIMARY KEY (id));insert into txtSup(nomeS,nomeT) values ('Fabio Moreira','Joao'),                                       ('Fabio Moreira','Eder'),                                       ('Fabio Moreira','Arnaldo');                                       CREATE TABLE txtProd(id int(11) AUTO_INCREMENT,nomeR varchar(30) NOT NULL,status varchar(30) NOT NULL,data varchar(30) NOT NULL,PRIMARY KEY (id));insert into txtProd(nomeR,status, data) values ('Joao','Concluída', '01/02/2015'),                                       ('Eder','Concluída', '01/02/2015'),                                       ('Arnaldo','Concluída', '01/02/2015'),                                       ('Joao','Não Concluída', '01/02/2015'),                                       ('Eder','Não Concluída', '01/02/2015'),                                       ('Arnaldo','Não Concluída', '01/02/2015'),                                       ('Joao','Concluída', '01/02/2015'),                                       ('Eder','Supensa', '01/02/2015'),                                       ('Arnaldo','Concluída', '01/02/2015'),                                       ('Joao','Iniciada', '01/02/2015'),                                       ('Eder','Concluída', '01/02/2015'),                                       ('Arnaldo','Concluída', '01/02/2015'),                                       ('Joao','Não Iniciada', '01/02/2015'),                                       ('Eder','Concluída', '01/02/2015'),                                       ('Arnaldo','Não Concluída', '01/02/2015'),                                       ('Joao','Concluída', '01/02/2015'),                                       ('Eder','Iniciada', '01/02/2015'),                                       ('Arnaldo','Concluída', '01/02/2015'),                                       ('Joao','NãoConcluída', '01/02/2015'),                                       ('Eder','Concluída', '01/02/2015'),                                       ('Arnaldo','Não Concluída', '01/02/2015');
=============================================================================================
 
SELECT txtSup.nomeS, txtProd.nomeR, Count(txtProd.status), txtProd.dataFROM txtSup INNER JOIN txtProdON txtSup.nomeT = txtProd.nomeRGROUP BY txtSup.nomeS, txtSup.nomeT, txtProd.nomeR, txtProd.status, txtProd.data
Link para o comentário
Compartilhar em outros sites

  • Moderador

Entendi.

 

Isso é do SQL mesmo. ele sempre vai repetir as linhas.. já passei por isso no meu TCC

A alternativa que eu usei, foi  fazer a consulta em varias tabelas por exemplo:

....FROM tabela, tabela2, tabela3... 

Vou tentar achar aqui meu  tcc para pegar o exemplo.

 

Uma coisa que você pode fazer é manipular via PHP.

 

PS: ao invés do access.. você pode usar o mysql..  ele permite importar arquivos .csv ou exportar para .xls

Link para o comentário
Compartilhar em outros sites

No access ele me ajuda muito, porque quando vou importar, digo que a primeira linha tem os nomes e ele automaticamente coloca as planilhas uma a uma embaixo uma da outra, não sei como eu faria isso com outra linguagem, mas vou estudar mais um pouco pra ver como posso fazer. 

@carecazn , @dif

 

Pessoal, li por cima e vi que vocês estão com problemas por estarem trazendo duas linhas, certo ?

Só que pelo que vi, não há como vir apenas uma, a não ser que você refine a pesquisa pelo status trazendo apenas Concluído ou Não Concluído.

 

É isso mesmo que entendi ?

Abraço!

Link para o comentário
Compartilhar em outros sites

  • Moderador

@Pimptech

Sim.

 

Eu já passei por isso uma vez, a única solução que eu consegui foi fazer uma consulta em diversas tabelas e agrupando.

Acredito que a única forma de contornar isso é você fazer uma consulta com subconsultas e criar uma VIEW na qual vai possuir os dados de todas as consultas feitas.

 

Só que para isso... no access não dá para fazer... teria de ser no mysql.

Link para o comentário
Compartilhar em outros sites

@Mention, na coluna Status eu tenho vários Status e eu gostaria de fazer igual ao Procv do Excel, criar uma consulta que em uma coluna da consulta ele conte quantos estão Concluídas da coluna Status da tabela txtProd, E na mesma consulta uma outra coluna que me traga todos os serviços Não Concluídos da coluna Status da tabela txtProd e também na mesma consulta mais uma coluna com os serviços pendentes da mesma coluna da tabela txtProd.

     Se for para trazer somente 1 Status ele funciona bem, conta direito, porém eu preciso dos outros Status.

 

     E quando eu coloco as 3 colunas ele repete cada Status Concluído em uma linha, na debaixo os Não Concluídos.

 

     Então fica assim:

 

FABIO MOREIRA   -  3 CONCLUÍDOS           - 16/03/2015

FABIO MOREIRA   -  3 NÃO CONCLUÍDOS   - 16/03/2015


E eu gostaria da consulta assim:

 

NOME                  - OK  - IMPRODUTIVO - PENDENTES

FABIO MOREIRA -  3                3             -          2

OUTRO TÉCNICO

OUTRO TÉCNICO

 

E com o Access 2013 não estou conseguindo este resultado, até instalei o MySQL e MySQL front, mas estrou estudando ainda como mexer com ele, importar os arquivos .csv, e depois como vou fazer para criar os relatórios.


Ok, vou estudar mais sobre o MySQL, não vai ter jeito.

Link para o comentário
Compartilhar em outros sites

     Olhem só, eu estava fazendo uns testes aqui e notei que se ele não achar um valor correspondente ele repete as linhas onde ele não achou nada, eu acho que preciso de fazer assim:
 
Cont igual abaixo para contar as Concluídas e se não tiver não faça nada entenderam? Igual a função if do PHP, se tiver conta se não retorne 0 por exemplo.
 
     Bom não tenho ,muita experiência, mas foi o que pude notar, porque eu não tinha ainda colocado a opção de Pendente e quando eu coloquei, tive mais linhas na coluna onde ele atribuiu 1 nas 3 colunas, então tinha 1 serviço pendente e ele colocou 1 em todas as colunas.
 
SELECT sup.Supervisor, prod.Recurso,        Count(([prod].[Status]) Like "Concluída") AS OK,        Count(([prod].[Status]) Like "Não Concluída" And "Suspensa") AS Improdutiva,        Count(([prod].[Status]) Like "Iniciada" And "Não Iniciada") AS Pendente,        prod.[Data Agendada para Execução] AS DataFROM sup INNER JOIN Prod ON sup.Tecnico = prod.RecursoGROUP BY sup.Supervisor, prod.Recurso, prod.[Data Agendada para Execução], prod.StatusHAVING (((prod.[Data Agendada para Execução])="01/02/15"));

 

Link para o comentário
Compartilhar em outros sites

@Mention, eu vi que deu certo, porém você poderia me explicar o que esta acontecendo la por favor?

 

@carecazn não funcionou o que eu te passei ?

 

SQL no geral funciona assim, eu fiz subselects na query. Esses subselects por sua vez rodam por linha, então a cada linha que o select retorna o subselect é executado então ele vai somando o máximo de status do recurso e depois agrupa pelo nome. Entendeu ?

 

Qualquer coisa, só falar.

 

Abraço!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!