Jump to content
Fórum Script Brasil
  • 0

Select Avançada


Eric Silva

Question

Olá a todos,

Sou novo por aqui. Estou aprendendo sql e encontrei aqui um problema que não consigo achar solução. Se alguma boa alma puder me ajudar:

É o seguinte, tenho uma tabela que recebe os dias que o funcionário trabalhou, assim:

funcionario dia

17 20/06

17 21/06

17 22/06

17 23/06

19 19/06

19 20/06

19 21/06

O que preciso reamente e filtrar essas informações e exibir-las desse jeito:

dias

matricula 19 20 21 22 23

17 x x x x

19 x x x

Ou seja, para cada dia ele que o funcionario trabalhar ele deve marcar com um x.

Isso é possivel só com SQL?

Se puderem me ajudar ficarei grato.

Link to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 0

Bom dia Eric,

Possível de se fazer em sql sim.... mas seria mais aconselhável montar os dados na ferramenta que utiliza para desenvolver.

- Você faria um "select distinct" para pegar apenas os dias de trabalho.

- Colocaria os dias em colunas.

- Depois faria um "select distinct" para pegar os códigos dos funcionários.

- Colocaria os funcionários em linhas.

- Faria um select para pegar as datas de trabalho e funcionários, colocando o X correspondentes.

Já fiz uma implementação parecida em VB6, utilizando Text Grid (bem semalhante ao excel).

Link to comment
Share on other sites

  • 0

Cara, vou tentar te ajudar mas acho que você não tá fazendo uma pergunta de SQL Server e sim de Java ou Delphi ou até mesmo VB porque o que você quer saber é como colocar os nomes dos clientes e marcar somente os dias que eles trabalharam, sendo assim você não tá no lugar certo, aqui é pergunta de SQL.

Mesmo assim preparei uma explicação pra você observe:

SELECT t.fun_codigo, t.fun_nome, x.ponto_data FROM tb_funcionario t, tb_ponto x

where t.fun_codigo = x.fun_codigo and

x.ponto_data between '2011-01-01' and '2011-01-20' and

t.fun_codigo in (1,2)

order by x.ponto_data

Esse é o código que você precisa pra conseguir o resultado que você deseja, mas a disposição do que você tem com esse código já é outra coisa.

Imagino que você precise que comente o código pra você então lá vai.

primeiramente eu fiz uma seleção buscando a tabela de funcionários e a tabela de ponto de trabalho.

TB_FUNCIONARIO:

fun_codigo - int - pk - not null (Autoincremento).

fun_nome - varchar(45) - notnull

TB_PONTO

ponto_codigo - int - pk - not null (Autoincremento).

ponto_data - datetime - notnull

fun_codigo - int - fk - not null // --- Essa chave extrangeira vem da tabela de funcionários

com a primeira linha fiz a seleção

Select * from tb_funcionario t, tb_ponto x

Apelidei a de funcionário de "t" e a de ponto de "x"

Depois preparei a primeira condição dizendo pra mostrar todos que estiverem cadastrados na tabela de funcionários que também estejam na tabela de ponto ou seja mostrar os que tem dias trabalhados e continuei com o "And" para mais uma condição.

Where t.fun_codigo = x.fun_codigo and

Na segunda condicional eu ordeno que filtre o campo onde fica registrada a data do ponto trabalhado em um intervalo de data, pra isso utilizei o comando BETWEEN sendo assim determinei uma data no formato aaaa-mm-dd, já que estou utilizando esse formato no BD e continuo para uma terceira condição com o "And" novamente.

x.ponto_data between '2011-01-01' and '2011-01-20' and

Na terceira condição eu determino que ele faça toda essa checagem somente nas matriculas que estiverem contidas na listagem dentro dos "()", mesmo que tenha informações das outras matriculas só vão ser mostrado as matriculas contidas no "()", ficando assim a linha de comando:

t.fun_codigo in (1,2)

E por fim eu coloco uma linha a mais, porém não é uma condição de comparação então não preciso continuar com o "And" para continuar, para ordenar pelo campo que eu quiser, no caso eu escoli pela data de ponto mas poderia ser outro campo.

order by x.ponto_data

Assim termina o meu comentário sobre o código informado acima.

Espero ter ajudado,

;) Abraço a todos.

OBS: não esqueça de colocar resolvido no seu post para saber-mos que não precisa mais tentar ajudar.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652k
×
×
  • Create New...