none
Consulta com valores de duas tabelas

    Question

  • Boas


    Preciso da vossa ajuda :) Este assunto requer ajuda de prós :P coisa que não sou....
    Preciso de saber quantos atendimentos os meus empregados fazem por dia.


    No sql server tenho duas tabelas...
    Tabela "horario" e Tabela "numero de atendimentos"


    Composição das TAbelas:


    Tabela "Horario":


    -3 colunas-
    Nome
    Horario
    Posto


    Tabela "numero de atendimentos":


    -3 colunas-
    totalclientes
    data
    funcionario


    Objectivo


    FAzer uma consulta com dados de duas tabelas. Na consulta preciso que apareca duas colunas da Tabela "Horario" e uma coluna com os calculos para cada empregado:


    Por isso o resultado da consulta seria:


    Nome
    Horario
    "Total de atendimentos por dia" Coluna criada para a consulta


    O Select da coluna "Total de atendimentos por dia" seria:


    Select Sum (Cast(Replace(totalclientes, ',','.') as float))
    From numero de atendimentos 
    Where funcionario = nome (da tabela Horario)
    and data = horario (da tabela Horario)


    Eu sei fazer o select escrevendo os nomes dos empregados, um a um. Agora preciso de evoluir, de fazer essa consulta toda de uma só vez para todos os empregados que estejam na tbl Horario.


    Como fazo isso? Pelo que eu li isso tem haver com agregação de tabela né?


    Aguardo pela vossa ajuda
    Obrigado :)

    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com


    Wednesday, March 28, 2012 3:27 PM

Answers

  • Bom dia Flashed,

    Neste caso acho que no 2º select faltou você restringir o campo F5 da tabela dados com o número 456658.

    veja se o select abaixo te ajuda. 

    Select base.numero, base.nome, Sum (Cast(Replace(dados.F8, ',','.') as float)) as [Total de atendimentos por dia]
    From base, dados
    where dados.F5 = base.numero
    AND ISNUMERIC(dados.F8) = 1
    and  dados.F5 = '456658'
    group by base.numero, base.nome

    Abçs,

    Adriano

    Thursday, March 29, 2012 12:20 PM

All replies

  • Flashed, boa tarde.

    Primeiramente vc precisa saber em qual campo as duas tabelas se relacionam. Depois de identificado o select fica assim :

    Select nome,horario,Sum (Cast(Replace(totalclientes, ',','.') as float)) as [Total de atendimentos por dia]
     From numero de atendimentos  a
    		inner join
    	Horario b
    		on a.id_funcionario = b.id_funcionario
    where data = getdate()		
     group by 
     nome,horario

    onde o id_funcionario é chave de relacionamento entre as duas tabelas. É só modificar com o nome da chave q vc tem aí. Lembrando que o critério do exemplo acima apenas trará o total de atendimentos no dia.

    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Wednesday, March 28, 2012 4:18 PM
  • Eduardo

    as minhas tabelas não tem chave de relacionamento....

    Isso é agrupamento de tabelas né?

    Obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Wednesday, March 28, 2012 4:28 PM
  • Vc precisa obrigatoriamente de um relacionamento entre as duas tabelas, pois como vc vai saber que horário um antendente fez um atendimento? O campo nome da tabela de horario é o nome do funcionário?

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Wednesday, March 28, 2012 4:32 PM
  • pois...tem lógica :)

    Pensei que desse para fazer isso via código.

    Como relaciono as tabelas? isso é via opções do sql server né?

    obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Wednesday, March 28, 2012 4:36 PM
  • Flashed, na verdade o que tu precisa é um campo que identifique o relacionamento.

    Vamos a um exemplo:

    Tabela funcionario

    codigo_funcionario

    nome

    Tabela atendimento

    codigo_atendimento

    descricao

    codigo_funcionario

    Desta forma podemos ligar as duas tabelas, pois conseguirei selecionar os funcionários exatos que realizaram o atendimento.

    Com este conceito bem fixado, o ideal seria posteriormente pensar sobre criar foreign keys, chaves estrangeiras, que elas OBRIGAM que seja inserido no campo codigo_funcionario da tabela atendimento, somente valores que existam na tabela funcionario.

    Mas acredito que com isso tu já possa estrutura melhor tua tabela para atender tuas necessidades.

    Espero que ajude.

    Vlew.


    --
    Marcus Vinícius Bittencourt
    blog: isqlserver.wordpress.com
    www.sqlserverRS.com.br

    Wednesday, March 28, 2012 4:49 PM
  • Hummm já começo a ter resultado :)

    Resolvi experimentar numa tabela diferente pois já começo  a fazer confusão :P

    Estou a testar entre a tabela base e dados.

    Mas neste momento estou com um problema:

    SELECT SUM(CAST(REPLACE(F8,',','.') AS float))
    FROM dados WHERE F5 = '456658'
    AND ISNUMERIC(F8) = 1 
    
    Select base.numero, base.nome, Sum (Cast(Replace(dados.F8, ',','.') as float)) as [Total de atendimentos por dia]
    From base, dados
    where dados.F5 = base.numero
    AND ISNUMERIC(dados.F8) = 1 
    group by base.numero, base.nome

    No primeiro Select dame o resultado de 1000 serviços

    no segundo Select da-me o resultado de 25000 serviços :S

    Mas o numero 456658 tem efectivamente 1000 serviços. Estarei a fazer mal o segundo select???

    Obrgiado ppl pela ajuda


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 10:13 AM
  • Flashed, bom dia.

    So segundo select vc faz um cruzamento com um outra tabela. Se o valor da chave estiver mais que um vez em uma das tabelas, o resultado será muito maior mesmo. Não conheço como estão suas tabelas por isso não posso dar um sugestão mais detalhada.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Thursday, March 29, 2012 12:13 PM
  • Bom dia Flashed,

    Neste caso acho que no 2º select faltou você restringir o campo F5 da tabela dados com o número 456658.

    veja se o select abaixo te ajuda. 

    Select base.numero, base.nome, Sum (Cast(Replace(dados.F8, ',','.') as float)) as [Total de atendimentos por dia]
    From base, dados
    where dados.F5 = base.numero
    AND ISNUMERIC(dados.F8) = 1
    and  dados.F5 = '456658'
    group by base.numero, base.nome

    Abçs,

    Adriano

    Thursday, March 29, 2012 12:20 PM
  • Flashed, bom dia.

    So segundo select vc faz um cruzamento com um outra tabela. Se o valor da chave estiver mais que um vez em uma das tabelas, o resultado será muito maior mesmo. Não conheço como estão suas tabelas por isso não posso dar um sugestão mais detalhada.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    Eduardo é esse o caso.

    Na tabela Base o 456658 só aparece uma vez, mas na tabela Dados aparece mais que uma vez. Dai estar a dar o resultado muitas vezes mais.

    Como faço para ele só ler uma vez o numero 456658?

    Adriano experimentei e deu o mesmo resultado, pois como o Eduardo falou tenho o numero mais que uma vez repetido na tabela, cada vez que encontra ele faz os cálculos e depois soma tudo.

    Obrigado 


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 12:55 PM
  • Bom dia Flashed,

    Neste caso não entendi muito bem o que você precisa, mais vamos tentar entender melhor o seu cenário.

    Na tabela DADOS você tem o registro '456658' 1000  vezes, até ai tudo bem.

    jà na tabela BASE quantas vezes vocês tem o um registro com o número '456658'? ( pelo que entendi é 25 ).

    Outra pergunta seria, o número '456658' é o único campo que identifica o registro que você precisa da tabela BASE?

    Estou pensando que, ou a linha da tabela BASE está duplicada ou falta mais algum campo que identifica a linha que realmente você precisa da tabela BASE.

    QUalquer dúvida posta ai.

    Abçs

    Adriano Nascimento

    Thursday, March 29, 2012 2:48 PM
  • Adriano é o seguinte:

    O numero 456658 é um empregado

    Na tabela Dados tenho vários registos do empregado 456658, por exemplo 50. Na coluna F8 tenho  os numeros de registos que ele fez.

    Na tabela Base tenho a minha lista de empregados, da qual consta o 456658 (apenas uma vez). Preciso de fazer a consulta para os empregados da tabela Base em que se crie uma coluna onde me dia o total de serviços feitos por cada um.

    Apenas isso :)

    Obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 3:05 PM
  • Flashed,

    Agora acho que entendi..rs

    Acho que você tem que utilizar o COUNT ao invés de SUM.

    Veja se dá certo o select abaixo.

    Select base.numero, base.nome, Count(dados.f8) as[Total de atendimentos por dia]
    From base, dados
    where dados.F5 = base.numero
    AND ISNUMERIC(dados.F8)= 1
    and  dados.F5 = '456658'
    group by base.numero, base.nome

    Abçs,

    Adriano Nascimento

    Thursday, March 29, 2012 3:27 PM
  • Atenção que os valores de serviços não sao sempre iguais. 

    Na tabela Dados tenho vários registos para o colaborador mas todos com números de serviços diferentes.

    nuns registos é igual a 1 noutros pode ser igual a 10,5. Dai o Replace.


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 3:30 PM
  • funciona mas não me da o numero certo de serviços, deve ser por não esta a somar

    obrigado


    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 3:34 PM
  • Compreendo,

    Estranho, o seu 2º select postado um pouco acima éra para funcionar então :)

    Não vejo outra alterantiva a não ser o select abaixo retornar mais de uma linha.

    select * from base
    where numero =  '456658';
    Thursday, March 29, 2012 3:46 PM
  • já resolvi :)

    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 4:05 PM
  • Obrgiado a todos pela grande ajuda. ;) Sem voces não conseguia

    Visual Basic 2008 Express Edition SQL Server Management Studio flashedr8@gmail.com

    Thursday, March 29, 2012 4:14 PM