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

Consulta dinámica SQL

Estas en el tema de Consulta dinámica SQL en el foro de SQL Server en Foros del Web. Saludos, esta vez si que me las eh visto difíciles con la necesidad de representar los datos de cierta manera, les comento que es para ...
  #1 (permalink)  
Antiguo 19/02/2013, 09:30
 
Fecha de Ingreso: junio-2012
Mensajes: 90
Antigüedad: 11 años, 10 meses
Puntos: 2
Consulta dinámica SQL

Saludos, esta vez si que me las eh visto difíciles con la necesidad de representar los datos de cierta manera, les comento que es para visualizar interés y saldos de una caja de ahorro, verán, a continuación adjunto una consulta:

Código SQL:
Ver original
  1. SELECT cau.id,pp.id_personal,ca.aportacion,ca.interes,ca.week FROM corp_caja_registro_ahorro ca
  2. INNER JOIN corp_caja_ahorro_usuarios cau ON cau.id=ca.id_usuario
  3. INNER JOIN corp_personal pp ON pp.id_personal=cau.id_personal
  4. WHERE cau.id_caja=1

Me muestra los datos de esta forma:



Y yo quiero mostrarlos así:



Es un Sp que se corre cada semana, me gustaría la posibilidad de ir modificando y agregando columnas diatónicamente cada semana hasta el termino del año y que por ejemplos los ID's personales se mantuvieran agrupados y así no se duplicasen al momento de correr el sp ya que por semana pueden o no hacer aportaciones..

Hasta el momento se me hace complejo este reporte por que aun no tengo la experiencia suficiente, estoy investigando poco a poco y recabando información, así que cualquier ayuda la agradecería muchísimo. Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 19/02/2013, 09:44
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Consulta dinámica SQL

para ese ejemplo específico que pusiste alli se me ocurre hacer un join con el mismo select y adjuntarle esas columnas a la derecha asi:

select a.*, b.aportacion, b.interes, b.week from(
SELECT cau.id,pp.id_personal,ca.aportacion,ca.interes,ca. week FROM corp_caja_registro_ahorro ca
INNER JOIN corp_caja_ahorro_usuarios cau ON cau.id=ca.id_usuario
INNER JOIN corp_personal pp ON pp.id_personal=cau.id_personal
WHERE cau.id_caja=1 and ca.week = 7
)a left join(
SELECT cau.id,pp.id_personal,ca.aportacion,ca.interes,ca. week FROM corp_caja_registro_ahorro ca
INNER JOIN corp_caja_ahorro_usuarios cau ON cau.id=ca.id_usuario
INNER JOIN corp_personal pp ON pp.id_personal=cau.id_personal
WHERE cau.id_caja=1 and ca.week = 8) b on a.id = b.id and a.id_personal = b.id_personal


se que no es la solución definitiva que buscas pero puede darte algunas ideas, saludos
  #3 (permalink)  
Antiguo 19/02/2013, 09:53
 
Fecha de Ingreso: diciembre-2012
Mensajes: 83
Antigüedad: 11 años, 4 meses
Puntos: 4
Respuesta: Consulta dinámica SQL

Ahora, si es que tienes los datos de muchas semanas, entonces podrias hacer un procedimiento que te guarde en tablas temporales los datos de cada semana por separado y asi luego te será mas silple hacer la consulta que te muestre los datos como quieres
  #4 (permalink)  
Antiguo 19/02/2013, 09:53
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: Consulta dinámica SQL

pregunta este reporte lo ocupas para tu trabajo? de ser asi si lo resuelvo yo que gano??? jejejeje
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/02/2013, 10:08
 
Fecha de Ingreso: junio-2012
Mensajes: 90
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Consulta dinámica SQL

Es mas que nada una estructuración pero me atore para mostrar los datos de esta manera, estaba revisando PIVOT y otros, sigo intentando, también estoy revisando la opción de tablas temporales.

PD: Libras, te vas ganar mi reconocimiento :D y mi agradecimiento :p
  #6 (permalink)  
Antiguo 19/02/2013, 10:26
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: Consulta dinámica SQL

U_U no pues no...pero me quedo con que lo pude resolver jejejeje


Código SQL:
Ver original
  1. CREATE TABLE #temp(
  2. id INT,
  3. id_personal INT,
  4. aportacion INT,
  5. interes INT,
  6. week INT
  7. )
  8. DELETE FROM #temp
  9.  
  10. INSERT INTO #temp VALUES (1,1,100,50,1)
  11. INSERT INTO #temp VALUES (1,1,200,50,2)
  12. INSERT INTO #temp VALUES (1,1,300,50,3)
  13. INSERT INTO #temp VALUES (1,1,400,50,4)
  14. INSERT INTO #temp VALUES (1,1,500,50,5)
  15.  
  16. INSERT INTO #temp VALUES (2,2,100,50,1)
  17. INSERT INTO #temp VALUES (2,2,200,50,2)
  18. INSERT INTO #temp VALUES (2,2,300,50,3)
  19. INSERT INTO #temp VALUES (2,2,400,50,4)
  20. INSERT INTO #temp VALUES (2,2,500,50,5)
  21. INSERT INTO #temp VALUES (2,2,600,50,6)
  22. INSERT INTO #temp VALUES (2,2,700,50,7)
  23.  
  24.  
  25. DECLARE @SELECT Nvarchar(MAX)
  26. DECLARE @JOIN Nvarchar(MAX)
  27. DECLARE @x INT
  28. DECLARE @cuantos INT
  29. DECLARE @x_v VARCHAR(20)
  30. DECLARE @ant VARCHAR(20)
  31. DECLARE @sig VARCHAR(20)
  32. DECLARE @query Nvarchar(MAX)
  33.  
  34. SELECT @cuantos=MAX(week) FROM #temp
  35.  
  36. SET @x=1
  37. SET @SELECT='select * from (
  38. select row_number() over (partition by t1.id,t1.id_personal order by t1.id,t1.id_personal) as rn,'
  39. SET @JOIN=''
  40.  
  41.  
  42. while @x<=@cuantos
  43. BEGIN
  44. SET @x_v=CONVERT(VARCHAR(20),@x)
  45. SET @ant=CONVERT(VARCHAR(20),@x-1)
  46. SET @sig=CONVERT(VARCHAR(20),@x+1)
  47.  
  48.  
  49. IF @x=@cuantos
  50. BEGIN
  51.   SET @SELECT=@SELECT + 't' + @x_v + '.aportacion as aportacion' + @x_v + ',' + 't' + @x_v + '.interes as interes'+ @x_v + ',isnull(t' +@x_v + '.week,t' +@x_v + '.week+1) as week' + @x_v + ' from #temp as t1'
  52. END  
  53. ELSE
  54. BEGIN
  55. SET @SELECT=@SELECT + 't' + @x_v + '.aportacion as aportacion' + @x_v + ',' + 't' + @x_v + '.interes as interes'+ @x_v + ',isnull(t' +@x_v + '.week,t' +@x_v + '.week+1) as week' + @x_v +','
  56. SET @JOIN=@JOIN + 'left join #temp as t' + @sig + ' on (t' + @x_v + '.id=t' + @sig + '.id and t' + @x_v + '.id_personal=t' + @sig + '.id_personal and t' + @sig + '.week=t' + @x_v + '.week+1) ' + CHAR(13)
  57. END
  58. SET @x=@x+1
  59. END
  60. SET @query=@SELECT + ' ' + @JOIN + ' ) as tabla where rn=1'
  61.  
  62. EXEC sp_sqlexec @query

Por cierto el query final queda de esta forma:

Código SQL:
Ver original
  1. SELECT * FROM (
  2. SELECT ROW_NUMBER() OVER (partition BY t1.id,t1.id_personal ORDER BY t1.id,t1.id_personal) AS rn,t1.aportacion AS aportacion1,t1.interes AS interes1,isnull(t1.week,t1.week+1) AS week1,t2.aportacion AS aportacion2,t2.interes AS interes2,isnull(t2.week,t2.week+1) AS week2,t3.aportacion AS aportacion3,t3.interes AS interes3,isnull(t3.week,t3.week+1) AS week3,t4.aportacion AS aportacion4,t4.interes AS interes4,isnull(t4.week,t4.week+1) AS week4,t5.aportacion AS aportacion5,t5.interes AS interes5,isnull(t5.week,t5.week+1) AS week5 FROM #temp AS t1 LEFT JOIN #temp AS t2 ON (t1.id=t2.id AND t1.id_personal=t2.id_personal AND t2.week=t1.week+1)
  3. LEFT JOIN #temp AS t3 ON (t2.id=t3.id AND t2.id_personal=t3.id_personal AND t3.week=t2.week+1)
  4. LEFT JOIN #temp AS t4 ON (t3.id=t4.id AND t3.id_personal=t4.id_personal AND t4.week=t3.week+1)
  5. LEFT JOIN #temp AS t5 ON (t4.id=t5.id AND t4.id_personal=t5.id_personal AND t5.week=t4.week+1)
  6.  ) AS tabla WHERE rn=1

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 19/02/2013, 13:49
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: Consulta dinámica SQL

y funciono, no funciono???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 19/02/2013, 21:03
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta dinámica SQL

Ni gracias, ni nada...
__________________
MCTS Isaias Islas
  #9 (permalink)  
Antiguo 20/02/2013, 08:59
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: Consulta dinámica SQL

Cita:
Iniciado por iislas Ver Mensaje
Ni gracias, ni nada...
Asi es este mundo de ingrato amigo aunque estaria bien que en lugar de gracias incluyera algun deposito en paypal
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #10 (permalink)  
Antiguo 20/02/2013, 10:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta dinámica SQL

El dinero destruye a las personas...
__________________
MCTS Isaias Islas
  #11 (permalink)  
Antiguo 20/02/2013, 12:10
 
Fecha de Ingreso: junio-2012
Mensajes: 90
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Consulta dinámica SQL

No había tenido la oportunidad de contestarte... muchísimas gracias Libras, fue de mucha ayuda tu método, me diste un montón de ideas para maximizar el reporte :D

Y perdón por la tardanza por que antes lo tuve que tratar de entender, es algo avanzado para mi.

Nuevamente Gracias!
  #12 (permalink)  
Antiguo 20/02/2013, 12:38
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: Consulta dinámica SQL

Cita:
Iniciado por 3ricks0ul Ver Mensaje
No había tenido la oportunidad de contestarte... muchísimas gracias Libras, fue de mucha ayuda tu método, me diste un montón de ideas para maximizar el reporte :D

Y perdón por la tardanza por que antes lo tuve que tratar de entender, es algo avanzado para mi.

Nuevamente Gracias!
Un monton de ideas??? bueno a parte de la solucion a lo que pedias jejejeje :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #13 (permalink)  
Antiguo 20/02/2013, 15:43
 
Fecha de Ingreso: junio-2012
Mensajes: 90
Antigüedad: 11 años, 10 meses
Puntos: 2
Respuesta: Consulta dinámica SQL

Si, me ayudaste a resolver el problema pero aparte me diste mas ideas :D jeje, nuevamente gracias n.n

Etiquetas: registro, select, sql
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 00:58.