Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Select con 3 tablas

Estas en el tema de Select con 3 tablas en el foro de SQL Server en Foros del Web. Hola a todo@s soy nuevo en sqlserver e intento hacer una consulta donde la información esta en tres tablas pero no he podido, los contextualizo ...
  #1 (permalink)  
Antiguo 20/08/2013, 16:13
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Select con 3 tablas

Hola a todo@s soy nuevo en sqlserver e intento hacer una consulta donde la información esta en tres tablas pero no he podido, los contextualizo sobre el problema.
Existe un tabla llama proyecciones que es donde se almacena el id de cliente y del proveedor, el año y el mes (por separado una columna int para el año y una columna int para el mes) esta la cuota que un vendedor debería vender a un cliente(de allí el nombre proyección);
por otro lado tenemos las ventas donde se almacenan unos datos como id producto, fecha de documento(es cuando se vendió un producto). linea (que es el codigo del proveedor que vende ese producto) la cantidad, precio por unidad y el total.
finalmente esta la tabla proveedores con un campo cebe(que es el codigo) el estado y el nombre del proveedor.
Apartir de alli quiero que me seleccione todos los proveedores que saque de la tabla proyecciones el valor de la cuota del presente mes, y que saque de la tabla ventas, las ventas del presente mes y del presente mes pero del año pasado.
he aqui una imagen de como esta diseñadas las tablas y sus claves.

https://www.dropbox.com/s/4fpz1lj5km62sxm/super%20consulta.png

De ante mane muchas gracias.
  #2 (permalink)  
Antiguo 20/08/2013, 16:25
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select con 3 tablas

y que llevas de este query?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 21/08/2013, 09:31
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

Libras ps tengo esto,

Código SQL:
Ver original
  1. SELECT [Newmovil].[dbo].[Proveedores].Cebe, SUM(PrecioTotal)AS mespasado
  2.  
  3. FROM [Newmovil].[dbo].[Proveedores], [Newmovil].[dbo].[Ventas]
  4.  
  5. WHERE Estado = '1' AND (FechaDocumento >= '01/07/2012' AND FechaDocumento <= '31/07/2012')
  6.  
  7.        AND (TipoDoc = '9' OR TipoDoc = '26' OR TipoDoc = '25') AND ( [Newmovil].[dbo].[Proveedores].CeBe COLLATE Modern_Spanish_CI_AS =  Ventas.Linea COLLATE
  8. Modern_Spanish_CI_AS) GROUP BY [Newmovil].[dbo].[Proveedores].CeBe

verifico los datos y son verídicos, tipoDoc=6 son criterio tales como devuelto, no entregado pero siempre seran esos mismos numeros

ahora esa consulta me devuelve todos los proveedores con la venta del año paso del mes de agosto, no puedo obtener o no se como obtener la de este año.
Si me podrías colaborar te agradecería Gracias
  #4 (permalink)  
Antiguo 21/08/2013, 11:03
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select con 3 tablas

usando los valores que se necesitan(no use todos los campos de tus tablas) se puede lograr algo como esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. fecha datetime,
  4. linea INT,
  5. ptotal INT
  6. )
  7.  
  8. CREATE TABLE #temp2
  9. (
  10. cve INT,
  11. nombre VARCHAR(20)
  12. )
  13.  
  14. CREATE TABLE #temp3
  15. (
  16. id INT,
  17. [año] INT,
  18. mes INT,
  19. cuota INT
  20. )
  21.  
  22.  
  23. INSERT INTO #temp VALUES ('07/03/2013',444,15000)
  24. INSERT INTO #temp VALUES ('07/23/2013',321,12500)
  25. INSERT INTO #temp VALUES ('07/24/2013',524,2400)
  26. INSERT INTO #temp VALUES ('07/03/2012',444,45000)
  27. INSERT INTO #temp VALUES ('07/04/2012',321,2500)
  28. INSERT INTO #temp VALUES ('07/24/2012',524,600)
  29.  
  30.  
  31. INSERT INTO #temp2 VALUES (444,'Kimberly')
  32. INSERT INTO #temp2 VALUES (321,'Diageo')
  33. INSERT INTO #temp2 VALUES (524,'choice')
  34. INSERT INTO #temp2 VALUES (525,'Libras')
  35.  
  36.  
  37. INSERT INTO #temp3 VALUES (321,2013,7,20000)
  38. INSERT INTO #temp3 VALUES (444,2013,5,3000)
  39. INSERT INTO #temp3 VALUES (444,2013,6,25000)
  40. INSERT INTO #temp3 VALUES (321,2013,5,500)
  41. INSERT INTO #temp3 VALUES (524,2013,7,26000)
  42. INSERT INTO #temp3 VALUES (524,2013,7,30000)
  43.  
  44. --------obtenemos la suma por los años(2013 y 2012 y por el mes 7, almacenamos este resultado en una tabla temporal #temp4)
  45.  
  46. SELECT año,linea,SUM(total) total INTO #temp4 FROM(
  47. SELECT datepart(yyyy,fecha) AS año,linea,SUM(ptotal) total FROM #temp WHERE datepart(mm,fecha)=7 GROUP BY
  48. datepart(yyyy,fecha),linea
  49. ) AS tabla GROUP BY año,linea
  50.  
  51.  
  52. SELECT nombre,SUM(isnull(cuota,0)) cuota,isnull(t4.[2012],0) AS [2012],isnull(t4.[2013],0) AS [2013] FROM(
  53. SELECT * FROM #temp3 AS t2
  54. WHERE t2.mes=7 AND t2.año=2013
  55. ) t1
  56. RIGHT JOIN #temp2 AS t3 ON (t1.id=t3.cve)
  57. LEFT JOIN (
  58. SELECT linea,[2012],[2013]
  59. FROM
  60. (
  61. SELECT año,total,linea FROM #temp4) AS sourcetable
  62. pivot(SUM(total) FOR año IN ([2012],[2013])
  63. ) AS pivottable
  64. ) AS t4 ON (t3.cve=t4.linea)
  65. GROUP BY año,mes,nombre,[2012],[2013]

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 21/08/2013, 13:15
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

Gracias libras lo voy a probar, si funciona me abras ayudado enormemente. Ojala y funcione ..:).
  #6 (permalink)  
Antiguo 21/08/2013, 13:30
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

que insertas en la tablas temp4?
  #7 (permalink)  
Antiguo 21/08/2013, 14:35
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select con 3 tablas

ahi en los comentarios del query dice que en #temp4 se insertan los acumulados por año por proveedor y por mes de la tabla #temp

si ejecutas el query veras que se obtiene el resultado que estas buscando (segun la imagen que mandaste)
saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 22/08/2013, 15:39
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

Gracias libras finalmente nos decidimos por este query
Código SQL:
Ver original
  1. SELECT Cebe,Nombre,
  2.      (    
  3.      SELECT SUM(PrecioTotal)
  4.       FROM [Newmovil].[dbo].[Ventas]
  5.       WHERE (FechaDocumento >= '01/07/2013' AND FechaDocumento <= '31/07/2013')
  6.        AND (TipoDoc = '9' OR TipoDoc = '26' OR TipoDoc = '25')  AND (ventas.Tercero = '89798765') AND ( Linea COLLATE Modern_Spanish_CI_AS = Newmovil.dbo.Proveedores.Cebe )
  7.       ) AS '2013',
  8.       (
  9.      SELECT SUM(PrecioTotal)
  10.       FROM [Newmovil].[dbo].[Ventas]
  11.       WHERE (FechaDocumento >= '01/07/2012' AND FechaDocumento <= '31/07/2012')
  12.        AND (TipoDoc = '9' OR TipoDoc = '26' OR TipoDoc = '25') AND (ventas.Tercero = '89798765') AND ( Linea COLLATE Modern_Spanish_CI_AS = Newmovil.dbo.Proveedores.Cebe)
  13.       ) AS '2012',
  14.       (SELECT SUM (ValorCuota) FROM proyecciones WHERE idCliente='89798765' AND (idproveedor=cebe COLLATE Modern_Spanish_CI_AS) AND año='2013' AND mes='07' GROUP BY idProveedor  )AS 'cuota'
  15. FROM [Newmovil].[dbo].[Proveedores]
  16. WHERE Estado = '1'"

Y corre bien ahora el problema es que no se como operar estos resultados entre si por ejemplo
Código SQL:
Ver original
  1. (2012-2013) AS resta
y que salga ps la resta de estos campos.
Gracias
  #9 (permalink)  
Antiguo 22/08/2013, 15:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select con 3 tablas

Código SQL:
Ver original
  1. SELECT cbe,nombre,[2012],[2013],([2013]-[2012]) AS resta
  2. FROM(
  3. SELECT Cebe,Nombre,
  4.      (    
  5.      SELECT SUM(PrecioTotal)
  6.       FROM [Newmovil].[dbo].[Ventas]
  7.       WHERE (FechaDocumento >= '01/07/2013' AND FechaDocumento <= '31/07/2013')
  8.        AND (TipoDoc = '9' OR TipoDoc = '26' OR TipoDoc = '25')  AND (ventas.Tercero = '89798765') AND ( Linea COLLATE Modern_Spanish_CI_AS = Newmovil.dbo.Proveedores.Cebe )
  9.       ) AS [2013],
  10.       (
  11.      SELECT SUM(PrecioTotal)
  12.       FROM [Newmovil].[dbo].[Ventas]
  13.       WHERE (FechaDocumento >= '01/07/2012' AND FechaDocumento <= '31/07/2012')
  14.        AND (TipoDoc = '9' OR TipoDoc = '26' OR TipoDoc = '25') AND (ventas.Tercero = '89798765') AND ( Linea COLLATE Modern_Spanish_CI_AS = Newmovil.dbo.Proveedores.Cebe)
  15.       ) AS [2012],
  16.       (SELECT SUM (ValorCuota) FROM proyecciones WHERE idCliente='89798765' AND (idproveedor=cebe COLLATE Modern_Spanish_CI_AS) AND año='2013' AND mes='07' GROUP BY idProveedor  )AS 'cuota'
  17. FROM [Newmovil].[dbo].[Proveedores]
  18. WHERE Estado = '1') tabla

Puedo preguntar porque no te usaste el query que arme, digo siento que en rendimiento mi proceso es mas rapido y mas entendible que lo que muestras....pero cada quien :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 23/08/2013, 07:41
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

Gracias funcion bien.
No use tu query porque al momento de estar añadiendo algunas modificaciones un compañero de trabajo lo logro de esa manera. al final era necesario saber esa información haciendo referencia a un cliente, tu query obtenía solo los proveedores de ese cliente, ahora bien tambien era necesario mostrarle los que no. al final por cuestiones de tiempo decidimos utilizar el de mi compañero. cuando tengamos mas tiempo observaremos cual de los dos es mas optimo, ya que este se demora al rededor de 4 segundos en responder.
Muchas gracias Libras.

Una ultima cosa cuando convierto los datos a money de da lo siguiente 8.999.876,00
como podría eliminar los últimos dos ceros incluyendo la coma (,00)?
  #11 (permalink)  
Antiguo 23/08/2013, 07:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Select con 3 tablas

Podrias hacerle con un substring convirtiendo la cadena a string, ahora dices bien mi query "solo" funciona con los valores que se necesitaban para armar la cadena si querias mas valores "tenias que agregarlos tu ademas de adaptar el query a tus necesidades" ya que mi solucion es solo una guia no es la solucion que vas a adaptar ya que para empezar desconosco el contenido de tu base de datos asi como del requerimiento y de las reglas de negocio que estas aplicando para obtener el resultado, pero si te funciona como lo tienes ok :)

saludos!!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 23/08/2013, 08:53
Avatar de EderBarriosCamargo  
Fecha de Ingreso: marzo-2013
Mensajes: 55
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Select con 3 tablas

ok gracias... Saludos!

Etiquetas: fecha, select, server, sql, tabla, tablas, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:07.