Array
(
)

Comparação de dados de tabelas diferentes

Dbajr
   - 05 mai 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

Marcos P
   - 05 mai 2015

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...
#Código

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...
#Código
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

Randrade
   - 05 mai 2015

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

#Código

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

Dbajr
   - 05 mai 2015


Citação:
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...
#Código

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...
#Código
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

Marcos P
   - 05 mai 2015

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 ).

Dbajr
   - 06 mai 2015


Citação:
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.

#Código

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

Marcos P
   - 06 mai 2015

Tente...

#Código

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

Dbajr
   - 06 mai 2015

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.

#Código

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.

Marcos P
   - 06 mai 2015

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

Dbajr
   - 13 mai 2015


Citação:
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

Ceilton M
   - 13 mai 2015

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

Marcos P
   - 13 mai 2015

Qual exatamente sua dificuldade ?

Dbajr
   - 13 mai 2015


Citação:
Qual exatamente sua dificuldade ?


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

Marcos P
   - 13 mai 2015

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

#Código

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...

Dbajr
   - 13 mai 2015


Citação:
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

#Código

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:

#Código
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

Marcos P
   - 13 mai 2015

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).

Dbajr
   - 14 mai 2015


Citação:
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).


Marcos, Desculpe minha ignorância, mas não vejo como isso é possivel.

Marcos P
   - 14 mai 2015

Do mesmo modo que você separou a unidade, isolando apenas o valor, você consegue pegar a unidade ( pela função "charindex" ) gravando-a em uma nova coluna na temporária.

A partir do momento que CONSUMO estiver "limpo", ou seja, com apenas o valor numérico, utilize a "convert" para transformá-lo em float.

Senão conseguir, vá no Fiddle, crie a estrutura das tabelas de origem e coloque alguns dados reais lá... que te ajudo com a query !