Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/07/2015, 10:03
jepinedaf
 
Fecha de Ingreso: julio-2015
Ubicación: Manizales
Mensajes: 2
Antigüedad: 8 años, 10 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