Comparação de dados de tabelas diferentes
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
exemplos da tabelas:
tb1
usuario, consumo
tb2
usuario, ramal, setor, andar
Simone
Curtidas 0
Respostas
Marcos P
05/05/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...
A posição sintética,fica...
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
GOSTEI 0
Randrade
05/05/2015
basta fazer uma consulta selecionando as duas tabelas e comparando os usuários da mesma, ficaria assim:
Qualquer dúvida, olhe este exemplo SqFiddle
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
GOSTEI 0
Simone
05/05/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...
A posição sintética,fica...
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
GOSTEI 0
Marcos P
05/05/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 ).
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 ).
GOSTEI 0
Simone
05/05/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 ).
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, ', '')
GOSTEI 0
Marcos P
05/05/2015
Tente...
select replace(replace(consumo, 'G', ''), 'M', '')
GOSTEI 0
Simone
05/05/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.
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.
GOSTEI 0
Marcos P
05/05/2015
Para converter para numérico é necessário remover todos os espaços, também !!!
GOSTEI 0
Simone
05/05/2015
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
GOSTEI 0
Ceilton M
05/05/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
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
GOSTEI 0
Marcos P
05/05/2015
Qual exatamente sua dificuldade ?
GOSTEI 0
Simone
05/05/2015
Qual exatamente sua dificuldade ?
Obrigada Cleiton.
Marcos, a duvida maior é como pegar os bytes, mega e transforma-los em GB separadamente.
GOSTEI 0
Marcos P
05/05/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
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...
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...
GOSTEI 0
Simone
05/05/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
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...
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
GOSTEI 0
Marcos P
05/05/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).
GOSTEI 0
Simone
05/05/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).
Marcos, Desculpe minha ignorância, mas não vejo como isso é possivel.
GOSTEI 0
Marcos P
05/05/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 !
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 !
GOSTEI 0