Restar informacion de dos tablas

31/10/2008 - 22:22 por Alonso Vilela | Informe spam
Tengo dos tablas una de entra y otra de salida, necesito restar le
coontenido de la tabla de entra con la de salida
(informacion de Entrada) select id_toner,sum(amount) from inputoner group by
id_toner

(Informacion de Salida) Select id_toner,sum(amount) from outputoner group by
id_toner

Necesito el resultado algo coimo

id_toner, total

1 50

Gracias

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
04/11/2008 - 20:11 | Informe spam
Hola otra vez Alonso,

On 4 nov, 19:58, "Carlos M. Calvelo" wrote:

En el segundo ejemplo (que hace lo mismo) sumo a los dos niveles
por eso hay también group by en los dos niveles.




Eso lo hice porque en tu pregunta original pones un
sum por id_toner en cada tabla. De ahí concluyo que
el id_toner no es único en cada una de las tablas.

Si el id_toner es único en inputoner y outputoner (si es
una clave) entonces eso no es necesario y puedes
olvidarte del segundo ejemplo.

Saludos,
Carlos
Respuesta Responder a este mensaje
#7 Alonso Vilela
04/11/2008 - 22:37 | Informe spam
muchas gracias por tu valiosa ayuda estube haciendo pruebas para analizar lo
que me dices,para enterderlo mejor y podre ausar en un futuro.

Ahora que esta trabajando bien estado tratando de unir el resultado con la
tabla Toner que tiene informacion sobre los nombres de toner que ahora si la
necesito..

Algo como

select id_toner, sum(amount) as total

from (select id_toner, amount from inputoner

union all

select id_toner, -amount from outputoner)as T

where id_toner > 0

group by id_toner

inner join

toner as tt

on t.id_toner = tt.id_toner

Pero cuando lo ejecuto me da error
Msg 156, Level 15, State 1, Line 7

Incorrect syntax near the keyword 'inner'.

como puedo solucionar esto

Gracias de antemano
Respuesta Responder a este mensaje
#8 Carlos M. Calvelo
04/11/2008 - 23:52 | Informe spam
Hola Alonso,

On 4 nov, 22:37, "Alonso Vilela" wrote:
muchas gracias por tu valiosa ayuda estube haciendo pruebas para analizar lo
que me dices,para enterderlo mejor y podre ausar en un futuro.

Ahora que esta trabajando bien estado tratando de unir el resultado con la
tabla Toner que tiene informacion sobre los nombres de toner que ahora si la
necesito..

Algo como

select id_toner, sum(amount) as total

from (select id_toner, amount from inputoner

union all

select id_toner, -amount from outputoner)as T

where id_toner > 0

group by id_toner

inner join

toner as tt

on t.id_toner = tt.id_toner

Pero cuando lo ejecuto me da error
Msg 156, Level 15, State 1, Line 7

Incorrect syntax near the keyword 'inner'.

como puedo solucionar esto

Gracias de antemano




Es el orden de las clausulas que no es correcto como tu lo
has puesto. En general el orden es :

select ...
from ... join ... join ...
where ...
group by ...
having ...
order by ...

Reordenando entonces queda:

select id_toner, sum(amount) as total
from (select id_toner, amount from inputoner
union all
select id_toner, -amount from outputoner) as T
inner join
toner as tt on t.id_toner = tt.id_toner
where id_toner > 0
group by id_toner

Como ves en JOIN es parte de la clausula FROM.
Puesto muy resumido: from T inner join TT on ..

Después el WHERE se aplica al resultado del todo el FROM.

Pero fíjate que en el select, where, y group by ahora tienes que
usar los alias (T o TT) para especificar a que tabla te refieres
cuando
usas una columna. En el select pongo también tt.nombre que es lo
que quieres ver de la tabla toner. Entonces quedaría así:

select t.id_toner, tt.nombre, sum(t.amount) as total
from (select id_toner, amount from inputoner
union all
select id_toner, -amount from outputoner) as T
inner join
toner as tt on t.id_toner = tt.id_toner
where t.id_toner > 0
group by t.id_toner


También puedes pasar el 'where id_toner > 0' a las subconsultas
para así reducir el resultado de la union pero con el mismo resultado.
Entonces quedaría así:

select t.id_toner, tt.nombre, sum(t.amount) as total
from (select id_toner, amount from inputoner where id_toner > 0
union all
select id_toner, -amount from outputoner where t.id_toner > 0
) as T
inner join
toner as tt on t.id_toner = tt.id_toner
group by t.id_toner

Los alias (t y tt) no es necesario usarlos si no hay ambigüedades.
Por ejemplo si amount solo existe en una de las tablas no es
necesario. Pero el id_toner puede venir de T o de TT y entonces
hay que especificarlo. Me parece de buen estilo especificarlo
siempre y ya está.

Suerte con las pruebas.

Saludos,
Carlos
Respuesta Responder a este mensaje
#9 Carlos M. Calvelo
05/11/2008 - 00:12 | Informe spam
"Carlos M. Calvelo" wrote:

select t.id_toner, tt.nombre, sum(t.amount) as total
from (select id_toner, amount from inputoner where id_toner > 0
union all
select id_toner, -amount from outputoner where t.id_toner > 0
) as T
inner join
toner as tt on t.id_toner = tt.id_toner
group by t.id_toner




Oops! Una corrección en la última versión de las pruebas que te he dejado:

Como vés he puesto una t. en el where de la segunda
consulta de la union. En ese select no hay tal ´t´, o
sea que tienes que quitarla. (Ponerlo igual que el where
en la primera)

Saludos,
Carlos
Respuesta Responder a este mensaje
#10 Alonso Vilela
05/11/2008 - 19:34 | Informe spam
Hey carlos muchas gracias por tu ayuda te pasaste...

No quiero abusar, pero una ultima consulta... con respecto a estas tablas
la de input y output tiene casi las misma estructura, seria convetienete
usar siempre las dos o adicionar un tag y solo usar una tabla

Para ser mas especifico, al de input es de ingreso del proveedor y salida a
produccion. La de output es de salida de produccion y retorno al Proveedor..

Gracias un millon


"Carlos M. Calvelo" wrote in message
news:
Hola Alonso,

On 4 nov, 22:37, "Alonso Vilela" wrote:
muchas gracias por tu valiosa ayuda estube haciendo pruebas para analizar
lo
que me dices,para enterderlo mejor y podre ausar en un futuro.

Ahora que esta trabajando bien estado tratando de unir el resultado con la
tabla Toner que tiene informacion sobre los nombres de toner que ahora si
la
necesito..

Algo como

select id_toner, sum(amount) as total

from (select id_toner, amount from inputoner

union all

select id_toner, -amount from outputoner)as T

where id_toner > 0

group by id_toner

inner join

toner as tt

on t.id_toner = tt.id_toner

Pero cuando lo ejecuto me da error
Msg 156, Level 15, State 1, Line 7

Incorrect syntax near the keyword 'inner'.

como puedo solucionar esto

Gracias de antemano




Es el orden de las clausulas que no es correcto como tu lo
has puesto. En general el orden es :

select ...
from ... join ... join ...
where ...
group by ...
having ...
order by ...

Reordenando entonces queda:

select id_toner, sum(amount) as total
from (select id_toner, amount from inputoner
union all
select id_toner, -amount from outputoner) as T
inner join
toner as tt on t.id_toner = tt.id_toner
where id_toner > 0
group by id_toner

Como ves en JOIN es parte de la clausula FROM.
Puesto muy resumido: from T inner join TT on ..

Después el WHERE se aplica al resultado del todo el FROM.

Pero fíjate que en el select, where, y group by ahora tienes que
usar los alias (T o TT) para especificar a que tabla te refieres
cuando
usas una columna. En el select pongo también tt.nombre que es lo
que quieres ver de la tabla toner. Entonces quedaría así:

select t.id_toner, tt.nombre, sum(t.amount) as total
from (select id_toner, amount from inputoner
union all
select id_toner, -amount from outputoner) as T
inner join
toner as tt on t.id_toner = tt.id_toner
where t.id_toner > 0
group by t.id_toner


También puedes pasar el 'where id_toner > 0' a las subconsultas
para así reducir el resultado de la union pero con el mismo resultado.
Entonces quedaría así:

select t.id_toner, tt.nombre, sum(t.amount) as total
from (select id_toner, amount from inputoner where id_toner > 0
union all
select id_toner, -amount from outputoner where t.id_toner > 0
) as T
inner join
toner as tt on t.id_toner = tt.id_toner
group by t.id_toner

Los alias (t y tt) no es necesario usarlos si no hay ambigüedades.
Por ejemplo si amount solo existe en una de las tablas no es
necesario. Pero el id_toner puede venir de T o de TT y entonces
hay que especificarlo. Me parece de buen estilo especificarlo
siempre y ya está.

Suerte con las pruebas.

Saludos,
Carlos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida