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

Problema con SQL Dinámmico

Estas en el tema de Problema con SQL Dinámmico en el foro de Bases de Datos General en Foros del Web. Hola a todos buenos días. Tengo un problema soberano con un SQL Dinámico. Tengo el siguiente SQL: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original *************************************************************** *************************************************************** ...
  #1 (permalink)  
Antiguo 22/07/2015, 10:03
 
Fecha de Ingreso: julio-2015
Ubicación: Manizales
Mensajes: 2
Antigüedad: 9 años, 3 meses
Puntos: 0
Sonrisa Problema con SQL Dinámmico

Hola a todos buenos días. Tengo un problema soberano con un SQL Dinámico. Tengo el siguiente SQL:

Código SQL:
Ver original
  1. ***************************************************************
  2. ***************************************************************
  3. ALTER PROCEDURE [dbo].[pa_PonderadoEncuestasPRUEBA]
  4.     -- Add the parameters for the stored procedure here
  5.     @tInicio        VARCHAR(30)     = NULL,
  6.     @tFinal         VARCHAR(30) = NULL 
  7.    
  8. AS
  9. SET @tInicio = CONVERT(VARCHAR(30),@tInicio,121)
  10. SET @tFinal = CONVERT (VARCHAR (30),dateadd (HOUR,23,@tFinal),121)
  11. SET @tFinal = CONVERT (VARCHAR (30),dateadd (MINUTE,59,@tFinal),121)
  12. SET @tFinal = CONVERT (VARCHAR (30),dateadd (SECOND,59,@tFinal),121)
  13. BEGIN
  14.     -- SET NOCOUNT ON added to prevent extra result sets from
  15.     -- interfering with SELECT statements.
  16.     SET NOCOUNT ON
  17.  
  18. DECLARE @columnast nvarchar(MAX)
  19. DECLARE @sqltemporal nvarchar(MAX)
  20. SET @columnast=''
  21.  
  22.  
  23.  
  24. DECLARE @columnas nvarchar(MAX)
  25. SET @columnas=''
  26. SELECT @columnas = COALESCE(@columnas + '[' + FechaRespuesta + '],','')  
  27.        FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a
  28.        INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON
  29.        a.idtransaccionivr=b.idtransaccionivr
  30.        INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON
  31.        b.Pre_Id = c.Pre_Id
  32.        WHERE c.PrePregunta NOT IN
  33.        ('Desea calificar el servicio','Marque 1 si logro solucionar su requerimiento y 2 si no','Observación de voz al finalizar encuesta','Despues de que el asesor le contesto como califica la rapidez para atenderle','Marque uno si recomienda el uso de esta linea a otras personas y 2 si no')
  34.        AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS
  35. SET @columnas=LEFT(@columnas,len(@columnas)-1)
  36.  
  37. SELECT @columnast = COALESCE(@columnast + '[' + FechaRespuesta + '] decimal(18, 2),','')  
  38.        FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a
  39.        INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON
  40.        a.idtransaccionivr=b.idtransaccionivr
  41.        INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON
  42.        b.Pre_Id = c.Pre_Id
  43.        WHERE c.PrePregunta NOT IN
  44.        ('Desea calificar el servicio','Marque 1 si logro solucionar su requerimiento y 2 si no','Observación de voz al finalizar encuesta','Despues de que el asesor le contesto como califica la rapidez para atenderle','Marque uno si recomienda el uso de esta linea a otras personas y 2 si no')
  45.        AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS
  46. SET @columnast=LEFT(@columnast,len(@columnast)-1)
  47.  
  48.  
  49. SET @sqltemporal ='create table tmp_total (campana varchar(100), pregunta varchar(250),'+@columnast+')'
  50. EXECUTE sp_executesql @sqltemporal
  51.  
  52. --print @sqltemporal
  53.  
  54.  
  55. DECLARE @SQLString nvarchar(MAX);
  56.  
  57. SET @SQLString = N'
  58.  
  59.  
  60. SELECT Campaña,[Pregunta], '+@columnas+'
  61. FROM
  62. (SELECT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) [Fecha_Respuesta]
  63.      ,c.PrePregunta Pregunta
  64.       ,case
  65.        when a.campana='+CHAR(39)+'Famisanar - Linea Amable POS'+CHAR(39)+' or a.campana='+CHAR(39)+'Famisanar - Quejas y Reclamos'+CHAR(39)+' then '+CHAR(39)+'Linea Amable POS'+CHAR(39)+'
  66.        when a.campana='+CHAR(39)+'Famisanar - Linea Amable PAC'+CHAR(39)+' then '+CHAR(39)+'Linea Amable PAC'+CHAR(39)+'
  67.        when a.campana='+CHAR(39)+'Famisanar - Traslados POS'+CHAR(39)+' or a.campana='+CHAR(39)+'Famisanar - Autorizaciones POS'+CHAR(39)+' then '+CHAR(39)+'Familinea'+CHAR(39)+'
  68.        else '+CHAR(39)+'Familinea1'+CHAR(39)+'
  69.        end Campaña
  70.      ,case
  71.        when c.PrePregunta = '+CHAR(39)+'Como califica el tiempo de espera para que el asesor le contestara'+CHAR(39)+' then
  72.          case
  73.          when b.valor=1 then 8.0
  74.          when b.valor=2 then 16.0
  75.          when b.valor=3 then 24.0
  76.          when b.valor=4 then 32.0
  77.          else 40.0
  78.          end
  79.        when c.Prepregunta in ('+CHAR(39)+'En terminos generales como le parecio el servicio prestado por el asesor que acaba de atenderle'+CHAR(39)+','+CHAR(39)+'La informacion entregada por el asesor fue clara y precisa'+CHAR(39)+') then
  80.          case
  81.          when b.valor=1 then 6.0
  82.          when b.valor=2 then 12.0
  83.          when b.valor=3 then 18.0
  84.          when b.valor=4 then 24.0
  85.          else 30.0
  86.        end
  87.      end Ponderado
  88. FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a
  89. inner join [FAMISANAR].[dbo].FamIvrEncuestaDetalle b on a.idtransaccionivr=b.idtransaccionivr
  90. inner join [FAMISANAR].[dbo].[FamPreguntas] c on b.Pre_Id = c.Pre_Id
  91. and c.PrePregunta not in ('+CHAR(39)+'Desea calificar el servicio'+CHAR(39)+','+CHAR(39)+'Marque 1 si logro solucionar su requerimiento y 2 si no'+CHAR(39)+','+CHAR(39)+'Observación de voz al finalizar encuesta'+CHAR(39)+','+CHAR(39)+'Despues de que el asesor le contesto como califica la rapidez para atenderle'+CHAR(39)+','+CHAR(39)+'Marque uno si recomienda el uso de esta linea a otras personas y 2 si no'+CHAR(39)+')
  92. and a.FechaRegistro between '+CHAR(39)+@tInicio+CHAR(39)+' and '+CHAR(39)+@tFinal+CHAR(39)+'
  93. ) AS SourceTable PIVOT
  94. (
  95. avg(Ponderado)
  96. FOR Fecha_Respuesta IN ('+@columnas +')
  97. ) AS PivotTable '
  98.  
  99.  
  100. INSERT INTO tmp_total
  101. EXECUTE sp_executesql @SQLString
  102.  
  103. SET @SQLString =@SQLString+ ' union  select campana,'+CHAR(39)+'TOTAL CAMPAÑA'+CHAR(39)+', '+REPLACE(REPLACE(@columnast,'] decimal(18, 2)','])'),'[','sum([')+ ' from tmp_total group by campana'
  104.  
  105. SET @SQLString =@SQLString+ ' union  select '+CHAR(39)+'-'+CHAR(39)+','+CHAR(39)+'TOTAL CAMPAÑA'+CHAR(39)+', '+REPLACE(REPLACE(@columnast,'] decimal(18, 2)','])'),'[','sum([')+ ' from tmp_total'
  106. EXECUTE sp_executesql @SQLString
  107.  
  108. print @SQLString
  109.  
  110. DROP TABLE tmp_total
  111.  
  112. SET NOCOUNT OFF
  113. END
  114. ***************************************************************
  115. ***************************************************************[
/I][/B]

Qué hace?: Toma los registros de una tabla en columna y pivotea los valores de fechas (las variables @columnas y columnast) como encabezados para sumar en ellos.

Cuál es el problema?, el siguiente:




Las fecha están saliendo en desorden y no he podido ordenarlas. Al ponerle un order by me dice que no es posible utilizarlo en subconsultas y no se qué más.

Esta es la porción de código que toma las fechas:
[I][B]
Código SQL:
Ver original
  1. DECLARE @columnas nvarchar(MAX)
  2. SET @columnas=''
  3. SELECT @columnas = COALESCE(@columnas + '[' + FechaRespuesta + '],','')  
  4.        FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a
  5.        INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON
  6.        a.idtransaccionivr=b.idtransaccionivr
  7.        INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON
  8.        b.Pre_Id = c.Pre_Id
  9.        WHERE c.PrePregunta NOT IN
  10.        ('Desea calificar el servicio','Marque 1 si logro solucionar su requerimiento y 2 si no','Observación de voz al finalizar encuesta','Despues de que el asesor le contesto como califica la rapidez para atenderle','Marque uno si recomienda el uso de esta linea a otras personas y 2 si no')
  11.        AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS
  12. SET @columnas=LEFT(@columnas,len(@columnas)-1)


Un millón de gracias a quien me pueda dar una luz al respecto.

Última edición por gnzsoloyo; 22/07/2015 a las 10:26
  #2 (permalink)  
Antiguo 22/07/2015, 10:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con SQL Dinámmico

Por favor, usa los highlights para poner el código, que para eso están.
Como lo hiciste se volvía imposible de leer.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 24/07/2015, 15:03
 
Fecha de Ingreso: julio-2015
Ubicación: Manizales
Mensajes: 2
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Problema con SQL Dinámmico

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por favor, usa los highlights para poner el código, que para eso están.
Como lo hiciste se volvía imposible de leer.
Hola, gracias por la recomendación. si ves, también tengo un problema con la imagen, o tú la puedes ver?

Gracias.
  #4 (permalink)  
Antiguo 24/07/2015, 15:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con SQL Dinámmico

Es posible que la ruta no sea pública.
Subelo a un repositorio que permita compartir el enlace como imagen.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: dinamico, order-by, sql, sql-server
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 12:00.