Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tauame

[Resolvido] Somar diferentes selects

Recommended Posts

Olá pessoal, eu tenho diversos selects funcionando(vamos chamá-los de 1ºselect, 2ºselect e 3ºselect), cada um destes selects retorna diversas linhas em uma coluna. Além disso, os 3 selects sempre retornam o mesmo número de linhas (se o 1º retornar 500 linhas, o 2º e o 3º também vão retornar 500 linhas).

Eu preciso criar uma consulta que some cada linha dos 3 selects e coloque o resultado em uma coluna, conforme o exemplo a seguir:

 

1ºselect 2ºselect 3ºselect soma
10       15       3        28
14       10       13       37
1        4        6        11
2        6        10       18
18       4        1.4      23.4

 

no fim eu ainda preciso pegar o MAX da coluna 'soma', neste caso seria 37.

 

Eu estou com dificuldades para colocar os 3 selects diferentes em uma única consulta para que apareçam conforme o exemplo. eu tentei usar join utilizando ROW_NUMBER, mas ficou muito lento.

 

Se algo não ficar claro, me avise que eu tento esclarecer mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tauame,

estes seus selects já estão separados???

ou o retorno dos três é esta tabela que montou?

 

A estrutura do resultado vai depender de como estes seus selects estão formados. Você não cita, por exemplo, se no 1º select tem alguma chave ou é resultado de alguma view por exemplo.

Teria como postar a estrutura?

 

Segundo: No MAX, você vai precisar agrupar os dados, isso pode ser feito em sua estrutura?

 

De mais detalhes.

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

os selects estão separados, cada um é executado separadamente retornando conforme a seguir:

 

resultado do 1ºselect:
10
14
1
2
18

resultado do 2ºselect:
15
10
4
6
4

resultado do 3ºselect:
3
13
6
10
1.4

 

cada select retorna um calculo feito em cima de uma tabela (eu não quis postar o select por ser complicado e extenso, possui cerca de 1500 caracteres).

Mas cada um começa assim: SELECT mm.valor * (cte.constante / 1000 * 4) AS Demanda_kWh FROM [...]

o resultado deles são apenas cálculos, não é utilizada nenhuma view.

 

segue a estrutura da consulta, para facilitar:

 

SELECT mm.valor * (cte.constante / 1000 * 4) AS Demanda_kWh 
FROM 	(
	(
		(campomemoria c INNER JOIN medicao me ON c.idmedicao = me.idmedicao and c.idequipamento = me.idequipamento) 
	INNER JOIN memoriamassa mm ON mm.idcampomemoria = c.idcampomemoria)
INNER JOIN constante AS cte ON mm.idcampomemoria = cte.idcampomemoria)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, vamos por partes:

 

como você tem o resultado dos três selects, soma eles direto, deste modo:

 


declare @tableA table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'A')
declare @tableB table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'B')
declare @tableC table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'C')




--resultado do 1ºselect:
insert into @tableA (VALOR) values (10)
insert into @tableA (VALOR) values (14)
insert into @tableA (VALOR) values (1)
insert into @tableA (VALOR) values (2)
insert into @tableA (VALOR) values (18)

--resultado do 2ºselect:
insert into @tableB (VALOR) values (15)
insert into @tableB (VALOR) values (10)
insert into @tableB (VALOR) values (4)
insert into @tableB (VALOR) values (6)
insert into @tableB (VALOR) values (4)

--resultado do 3ºselect:
insert into @tableC (VALOR) values (3)
insert into @tableC (VALOR) values (13)
insert into @tableC (VALOR) values (6)
insert into @tableC (VALOR) values (10)
insert into @tableC (VALOR) values (1.4)



SELECT a.id , a.valor, b.valor, c.valor , (a.valor + b.valor + c.valor) as soma
FROM @tableA A 
INNER JOIN @tableB b ON a.id = b.id
INNER JOIN @tableC c ON a.id = c.id

 

Note que no meu caso, o tipo de campo é FLOAT, e consigo usar o mais (+) somo uma soma e não concatenando, como é de costume.

 

Veja se lhe serve.

 

em tempo:


declare @tableA table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'A')
declare @tableB table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'B')
declare @tableC table (id int identity(1,1), valor FLOAT, tabela varchar(1) default 'C')




--resultado do 1ºselect:
insert into @tableA (VALOR) values (10)
insert into @tableA (VALOR) values (14)
insert into @tableA (VALOR) values (1)
insert into @tableA (VALOR) values (2)
insert into @tableA (VALOR) values (18)

--resultado do 2ºselect:
insert into @tableB (VALOR) values (15)
insert into @tableB (VALOR) values (10)
insert into @tableB (VALOR) values (4)
insert into @tableB (VALOR) values (6)
insert into @tableB (VALOR) values (4)

--resultado do 3ºselect:
insert into @tableC (VALOR) values (3)
insert into @tableC (VALOR) values (13)
insert into @tableC (VALOR) values (6)
insert into @tableC (VALOR) values (10)
insert into @tableC (VALOR) values (1.4)


declare @resultado table (id int, valorA float, valorB float, valorC float, soma float, [max] float)
insert into @resultado (ID, valorA, valorB, valorC, soma)

SELECT a.id , a.valor, b.valor, c.valor , (a.valor + b.valor + c.valor) as soma
FROM @tableA A 
INNER JOIN @tableB b ON a.id = b.id
INNER JOIN @tableC c ON a.id = c.id


update @resultado set [max] = (select max(soma) from @resultado)
update @resultado set [max] = null where [max] <> soma 

select * from @resultado

 

Só montei um esquema para update do max em um campo a parte.

Estou trabalhando com temporarias no SQL2005 > é o seu caso?

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

no meu caso, os dados das 3 consultas estão na mesma tabela, o que muda é apenas a maneira como estes dados são filtrados (o WHERE).

 

mas a idéia de criar uma tabela temporária para armazenar os valores pode dar certo, vou tentar fazer isso e ver se funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

no meu caso, os dados das 3 consultas estão na mesma tabela, o que muda é apenas a maneira como estes dados são filtrados (o WHERE).

 

mas a idéia de criar uma tabela temporária para armazenar os valores pode dar certo, vou tentar fazer isso e ver se funciona.

 

Então esta mais fácil do que o exemplo que passei.

Joga os resultados em uma temporária (que não precisa ser necessariamente @) e faz os cálculos como passei.

 

Se der errado, poste o erro e a sua versão do SQL.

 

Boa sorte

Compartilhar este post


Link para o post
Compartilhar em outros sites

No Oracle temos uma coluna virtual que apenas numera o select rownum

 

fazendo

 

select rownum seq,a,b,c
from tabela1

 

poderia ser feito

 

select *
from
(select rownum seq,a,b,c from tabela1) t1,
(select rownum seq,a,b,c from tabela2) t2,
(select rownum seq,a,b,c from tabela3) t3
where t1.seq = t2.seq
and   t1.seq = t3.seq

 

As tabelas estariam "alinhadas" seria "só" fazer conta.

 

Sql Server tem algo como ROWNUM do Oracle ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta, tem sim. a função no caso é a ROWNUMBER. Não coloquei um exemplo assim pois nao conhecia a estrutura nem a versão utilizada.

 

Tauame, deu certo?

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

funcionou smile.gif

 

eu criei uma tabela temporária, e depois só dei um select MAX(soma) nela. Valeu gente! biggrin.gif

 

Precisando, use a busca do fórum ou volte a postar. clap.gif

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.