Comparação de dados de tabelas diferentes

05/05/2015

Oi pessoal, preciso apresentar um relatorio com a quantidade de consumo de internet por setor, tenho uma tabela com o nome de cada usuario e o consumo individual, também tenho outra tabela com os dados de todos usuários,incluindo o setor. Poderiam me dar uma "luz" ?

exemplos da tabelas:

tb1
usuario, consumo

tb2
usuario, ramal, setor, andar

Respostas

05/05/2015

Marcos P

Assumindo que "usuario" é a chave de ligação entre as tabelas e consumo é um campo numérico com a quantidade que você deseja apurar...

A posição analitica, com todos os registros, fica...
select tb2.usuario, tb2.ramal, tb2.setor, tb2.andar, tb1.consumo
from tb1 inner join tb2 on ( tb1.usuario = tb2.usuario)


A posição sintética,fica...
select tb2.usuario, tb2.ramal, tb2.setor, tb2.andar, sum(tb1.consumo) as TotalConsumo
from tb1 inner join tb2 on ( tb1.usuario = tb2.usuario)
group by tb2.usuario, tb2.ramal, tb2.setor, tb2.andar
Responder Citar

05/05/2015

Randrade

basta fazer uma consulta selecionando as duas tabelas e comparando os usuários da mesma, ficaria assim:

select tb1.usuario, tb1.consumo, tb2.ramal, tb2.setor, tb2.andar from tb1 where tb1.usuario = tb2.usuario


Qualquer dúvida, olhe este exemplo SqFiddle
Responder Citar

05/05/2015

Dbajr

Assumindo que "usuario" é a chave de ligação entre as tabelas e consumo é um campo numérico com a quantidade que você deseja apurar... A posição analitica, com todos os registros, fica...
select tb2.usuario, tb2.ramal, tb2.setor, tb2.andar, tb1.consumo
from tb1 inner join tb2 on ( tb1.usuario = tb2.usuario)
A posição sintética,fica...
select tb2.usuario, tb2.ramal, tb2.setor, tb2.andar, sum(tb1.consumo) as TotalConsumo
from tb1 inner join tb2 on ( tb1.usuario = tb2.usuario)
group by tb2.usuario, tb2.ramal, tb2.setor, tb2.andar



Esqueci de um grande detalhe, na coluna de consumo tem M(mega) e G(Giga), portanto o SUM não funciona não é?


exemplo:
Usuario consumo

u1 1.1 G
u2 1.0 G
u3 1.0 G
u4 998.7 M
u5 963.8 M
Responder Citar

05/05/2015

Marcos P

Não, nesse caso o sum() não funcionará...

Você pode tratar isso na aplicação, consolidando os dados obtidos na posição analítica.

Ou... você pode trabalhar com uma temporária transformando essas duas unidades de medida e um um valor numérico proporcional ( para, aí sim, aplicar o sum ).
Responder Citar

06/05/2015

Dbajr

Não, nesse caso o sum() não funcionará... Você pode tratar isso na aplicação, consolidando os dados obtidos na posição analítica. Ou... você pode trabalhar com uma temporária transformando essas duas unidades de medida e um um valor numérico proporcional ( para, aí sim, aplicar o sum ).


Valeu pela dica Marco P,

Utilizei o replace pra tratamento, só estou com duvida em como eliminar as duas letras M e G de uma vez.

select replace (consumo, 'M, ', '') 
Responder Citar

06/05/2015

Marcos P

Tente...

select replace(replace(consumo, 'G', ''), 'M', '')
Responder Citar

06/05/2015

Dbajr

O replace deu certo, agora estou tentando converter pra poder somar, mas esta dando erro, já tentei o convert com os todos os tipos numéricos.

SELECT  replace (convert (int, replace (consumo, 'M', '')),'G',' ')

Mensagem 245, Nível 16, Estado 1, Linha 2
Falha ao converter o varchar valor '377 081' para o tipo de dados int.

Responder Citar

06/05/2015

Marcos P

Para converter para numérico é necessário remover todos os espaços, também !!!
Responder Citar

13/05/2015

Dbajr

Para converter para numérico é necessário remover todos os espaços, também !!!


Oi Marcos surgiu outro problema aqui, tive que deixar esse de lado, mas então, eu criei uma tebela temporaria, e conseguir inserir os dados,
A minha dificuldade agora está sendo, deixar tudo em GB, que é como apresentamos no relatorio.

E no caso tem bites, giga e mega.
Por exemplo:

8 850 b
168.2 M
10.7 G
Responder Citar

13/05/2015

Ceilton M

1 byte
1 kbyte -> 1024 byte
1 M -> 1024 kbyte
1 G -> 1024 Mbytes

-- De Bytes para Megas
(Valb / 1024) / 1024

-- De Kbytes para Mbytes
ValK / 1024

-- De Gbytes para Mbytes
ValG * 1024
Responder Citar

13/05/2015

Marcos P

Qual exatamente sua dificuldade ?
Responder Citar

13/05/2015

Dbajr

Qual exatamente sua dificuldade ?


Obrigada Cleiton.
Marcos, a duvida maior é como pegar os bytes, mega e transforma-los em GB separadamente.
Responder Citar

13/05/2015

Marcos P

A forma de fazer, depende de como ficou a estrutura de sua tabela temporária...

A estrutura mais comum, seriam de duas colunas : Valor e Unidade.

Se for isso, faça um case na sua query e aplique uma das fórmulas colocada pelo Cleiton, convertendo para a unidade desejada.

Exemplo

select Valor, Unidade, 
       case
         when Unidade = 'MB' then Valor/1024
         when Unidade = 'B' them Valor/(1024*1024)
         else Valor
       end as ValorGB
: 


Nesse formato, a conversão de Bytes para GigaBytes vai ficar bem estranha ( pois a divisão vai dar um número muito pequeno ).

Se sua estrutura não é essa, detalhe ela aqui...
Responder Citar

13/05/2015

Dbajr

A forma de fazer, depende de como ficou a estrutura de sua tabela temporária... A estrutura mais comum, seriam de duas colunas : Valor e Unidade. Se for isso, faça um case na sua query e aplique uma das fórmulas colocada pelo Cleiton, convertendo para a unidade desejada. Exemplo
select Valor, Unidade, 
       case
         when Unidade = 'MB' then Valor/1024
         when Unidade = 'B' them Valor/(1024*1024)
         else Valor
       end as ValorGB
: 
Nesse formato, a conversão de Bytes para GigaBytes vai ficar bem estranha ( pois a divisão vai dar um número muito pequeno ). Se sua estrutura não é essa, detalhe ela aqui...


Entendi Marcos, se for o caso eu mudo a estrutura.
A minha estrutura é a seguinte:

create table #temp(
login varchar (30), nome varchar (100), andar varchar(6) ,consumo numeric) 
insert into #temp
select tb2.LOGIN, tb2.USUARIO, tb2.ANDAR, replace(replace (convert (int, replace (consumo, 'M', '')),'G',' '),' ','')CONSUMO

Responder Citar

13/05/2015

Marcos P

Separe a unidade de medida em uma coluna específica na temporária e aplique a ideia que lhe passei acima, considerando : Valor = convert(Float,Consumo).
Responder Citar