SQL Server - duda sobre consuta a 2 tablas

   
Vista:

duda sobre consuta a 2 tablas

Publicado por Diego (5 intervenciones) el 14/10/2011 17:59:09
saludos a todos, tengo un problema con una consulta que pienso hacer ya que la necesito para un sistema de kardex, mi duda es si se podria alternar los rows de 2 consultas en este caso ventas y compras para mostrarlas en una grilla de manera que se vean las entradas y salidas de productos. yo pienso que no se puede pero espero este equivocado muchas gracias de antemano y espero me puedan ayudar. saludos

el resultado seria algo como esto claro si fuera posible :


idcompra---cod_producto--cantidad---importe--- fecha

idventa---cod_producto---cantidad---importe ---fecha

idcompra---cod_producto--cantidad---importe--- fecha

idventa---cod_producto---cantidad---importe ---fecha

idcompra---cod_producto--cantidad---importe--- fecha

idventa---cod_producto---cantidad---importe ---fecha

idcompra---cod_producto--cantidad---importe--- fecha

idventa---cod_producto---cantidad---importe ---fecha


osea alternar los rows de las consultas muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

duda sobre consuta a 2 tablas

Publicado por leonardo_josue (79 intervenciones) el 14/10/2011 22:05:21
Hola Diego:

Al no poner datos reales, resulta un poco complicado poder saber qué es lo que quieres realmente, además tendrías que aclararnos varios puntos, por ejemplo si el número de compras y ventas es siempre el mismo (que no creo sea el caso), si existen compras y ventas múltiples de un mismo producto, si estás utilizando algún criterio de ordenación, si el número de idcompra y el idventa no se puede repetir, ya que de lo contrario podría duplicarse un registro,

Tampoco nos mencionas que Versión-Edición de SQL Server estás utilizando, lo que es muy importante para saber qué set de funciones tienes disponibles. Sin embargo, tratando de adivinar un poco y poniendo algunos datos al azar, se me ocurre que utilices la función ROW_NUMBER junto a una UNION para poder intercalar los registros. Checa este script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
declare @compras table (id_compra int, cod_producto varchar(10), cantidad int, importe int, fecha datetime)
insert into @compras values (51, 'producto 1', 10, 112, getdate())
insert into @compras values (60, 'producto 2', 20, 73, getdate())
insert into @compras values (70, 'producto 3', 12, 23, getdate())
insert into @compras values (80, 'producto 1', 34, 12, getdate())
insert into @compras values (90, 'producto 1', 56, 23, getdate())
insert into @compras values (100, 'producto 3', 12, 134, getdate())
select * from @compras
 
declare @ventas table (id_venta int, cod_producto varchar(10), cantidad int, importe int, fecha datetime)
insert into @ventas values (10, 'producto 1', 10, 99, getdate())
insert into @ventas values (20, 'producto 1', 20, 98, getdate())
insert into @ventas values (30, 'producto 3', 40, 97, getdate())
insert into @ventas values (40, 'producto 1', 50, 96, getdate())
select * from @ventas
 
select row_number() over (partition by cod_producto order by cod_producto) posicion,
'compra' as tipo, id_compra as id, cod_producto, cantidad, importe, fecha
from @compras
union all
select row_number() over (partition by cod_producto order by cod_producto) posicion,
'venta' as tipo, id_venta as id,
cod_producto, cantidad, importe, fecha
from @ventas
order by cod_producto, posicion, tipo


El resultado de esta consulta, con los datos de ejemplo sería

1
2
3
4
5
6
7
8
9
10
11
12
posicion             tipo   id          cod_producto cantidad    importe     fecha
-------------------- ------ ----------- ------------ ----------- ----------- -----------------------
1                    compra 51          producto 1   10          112         2011-10-14 15:01:25.850
1                    venta  10          producto 1   10          99          2011-10-14 15:01:25.850
2                    compra 80          producto 1   34          12          2011-10-14 15:01:25.850
2                    venta  20          producto 1   20          98          2011-10-14 15:01:25.850
3                    compra 90          producto 1   56          23          2011-10-14 15:01:25.850
3                    venta  40          producto 1   50          96          2011-10-14 15:01:25.850
1                    compra 60          producto 2   20          73          2011-10-14 15:01:25.850
1                    compra 70          producto 3   12          23          2011-10-14 15:01:25.850
1                    venta  30          producto 3   40          97          2011-10-14 15:01:25.850
2                    compra 100         producto 3   12          134         2011-10-14 15:01:25.850


Observa que por ejemplo hay dos compras juntas

1
2
1                    compra 60          producto 2   20          73          2011-10-14 15:01:25.850
1                    compra 70          producto 3   12          23          2011-10-14 15:01:25.850


Esto es porque no hay ninguna venta del producto 2.

Dale un vistazo para ver si te puede servir de algo el código,
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

duda sobre consuta a 2 tablas

Publicado por Diego (5 intervenciones) el 14/10/2011 22:45:04
muchas gracias por tu tiempo voy a pbrobar mi consulta y te comento gracias de nuevo !!.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

duda sobre consuta a 2 tablas

Publicado por Diego (5 intervenciones) el 14/10/2011 23:28:38
bueno antes que nada disculpas por no ser mas especifico : uso mssql server 2000 la tabla factura tiene su clave varchar que es el numero de factura tambien esta la tabla detalle_factura y la tabla ventas tiene clave int y tambien una tabla detalle_venta aca dejo las dos consultas que desearia unir muchas gracias por el tiempo que te tomas para contribuir .



select f.cod_factura,f.cod_proveedor,f.forma_de_pago,fecha,df.cod_producto,df.cantidad,df.importe,df.igv from factura f inner join detalle_factura df
on f.cod_factura=df.cod_factura
order by f.fecha

select v.cod_venta,v.cod_factura,v.cod_tienda,v.monto,v.fecha,dv.cod_producto,dv.cantidad from ventas v inner join detalle_venta dv on v.cod_venta=dv.cod_venta
order by v.fecha

las dos consultas funcionan y devuelven lo que desearia .


pd: existe el row_number en mssql 2000?? por que no pude usarla
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

duda sobre consuta a 2 tablas

Publicado por Isaias (3186 intervenciones) el 14/10/2011 23:56:12
No, desafortunadamente la version 2000, ya esta considerada como obsoleta y no maneja muchas de las nuevas instrucciones de 2005, ya no digamos de 2008
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

duda sobre consuta a 2 tablas

Publicado por Diego (5 intervenciones) el 15/10/2011 00:13:26
entonces ? que podria hacer?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias

duda sobre consuta a 2 tablas

Publicado por Isaias (3186 intervenciones) el 18/10/2011 01:59:31
De ser posible, migra tu base a la version 2008

Te dejo una consulta que funciona para 2000, creando el autonumerico.

CREATE TABLE #NOMBRES(
NOMBRE VARCHAR(50) not null
)
GO

insert into #NOMBRES values('ADRIANA')
insert into #NOMBRES values('LAURA')
insert into #NOMBRES values('NANCY')
insert into #NOMBRES values('ROBERTO')
insert into #NOMBRES values('DANAE')


SELECT
(SELECT COUNT(*)
FROM #NOMBRES AS NOMBRES2
WHERE NOMBRES2.NOMBRE <= NOMBRES1.NOMBRE) AS Numero,
NOMBRE
FROM #NOMBRES AS NOMBRES1
ORDER BY NOMBRE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar