Código SQL:
/I][/B]Ver original
*************************************************************** *************************************************************** ALTER PROCEDURE [dbo].[pa_PonderadoEncuestasPRUEBA] -- Add the parameters for the stored procedure here @tInicio VARCHAR(30) = NULL, @tFinal VARCHAR(30) = NULL AS SET @tInicio = CONVERT(VARCHAR(30),@tInicio,121) SET @tFinal = CONVERT (VARCHAR (30),dateadd (HOUR,23,@tFinal),121) SET @tFinal = CONVERT (VARCHAR (30),dateadd (MINUTE,59,@tFinal),121) SET @tFinal = CONVERT (VARCHAR (30),dateadd (SECOND,59,@tFinal),121) BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON DECLARE @columnast nvarchar(MAX) DECLARE @sqltemporal nvarchar(MAX) SET @columnast='' DECLARE @columnas nvarchar(MAX) SET @columnas='' SELECT @columnas = COALESCE(@columnas + '[' + FechaRespuesta + '],','') FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON a.idtransaccionivr=b.idtransaccionivr INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON b.Pre_Id = c.Pre_Id WHERE c.PrePregunta NOT IN ('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') AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS SET @columnas=LEFT(@columnas,len(@columnas)-1) SELECT @columnast = COALESCE(@columnast + '[' + FechaRespuesta + '] decimal(18, 2),','') FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON a.idtransaccionivr=b.idtransaccionivr INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON b.Pre_Id = c.Pre_Id WHERE c.PrePregunta NOT IN ('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') AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS SET @columnast=LEFT(@columnast,len(@columnast)-1) SET @sqltemporal ='create table tmp_total (campana varchar(100), pregunta varchar(250),'+@columnast+')' EXECUTE sp_executesql @sqltemporal --print @sqltemporal DECLARE @SQLString nvarchar(MAX); SET @SQLString = N' SELECT Campaña,[Pregunta], '+@columnas+' FROM (SELECT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) [Fecha_Respuesta] ,c.PrePregunta Pregunta ,case 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)+' when a.campana='+CHAR(39)+'Famisanar - Linea Amable PAC'+CHAR(39)+' then '+CHAR(39)+'Linea Amable PAC'+CHAR(39)+' 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)+' else '+CHAR(39)+'Familinea1'+CHAR(39)+' end Campaña ,case when c.PrePregunta = '+CHAR(39)+'Como califica el tiempo de espera para que el asesor le contestara'+CHAR(39)+' then case when b.valor=1 then 8.0 when b.valor=2 then 16.0 when b.valor=3 then 24.0 when b.valor=4 then 32.0 else 40.0 end 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 case when b.valor=1 then 6.0 when b.valor=2 then 12.0 when b.valor=3 then 18.0 when b.valor=4 then 24.0 else 30.0 end end Ponderado FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a inner join [FAMISANAR].[dbo].FamIvrEncuestaDetalle b on a.idtransaccionivr=b.idtransaccionivr inner join [FAMISANAR].[dbo].[FamPreguntas] c on b.Pre_Id = c.Pre_Id 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)+') and a.FechaRegistro between '+CHAR(39)+@tInicio+CHAR(39)+' and '+CHAR(39)+@tFinal+CHAR(39)+' ) AS SourceTable PIVOT ( avg(Ponderado) FOR Fecha_Respuesta IN ('+@columnas +') ) AS PivotTable ' INSERT INTO tmp_total EXECUTE sp_executesql @SQLString 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' 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' EXECUTE sp_executesql @SQLString print @SQLString DROP TABLE tmp_total SET NOCOUNT OFF END *************************************************************** ***************************************************************[
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
DECLARE @columnas nvarchar(MAX) SET @columnas='' SELECT @columnas = COALESCE(@columnas + '[' + FechaRespuesta + '],','') FROM (SELECT DISTINCT SUBSTRING(CONVERT (VARCHAR(10),b.FechaRespuesta,111),1,10) AS FechaRespuesta FROM [FAMISANAR].[dbo].[FamIvrEncuestaMaestro] a INNER JOIN [FAMISANAR].[dbo].FamIvrEncuestaDetalle b ON a.idtransaccionivr=b.idtransaccionivr INNER JOIN [FAMISANAR].[dbo].[FamPreguntas] c ON b.Pre_Id = c.Pre_Id WHERE c.PrePregunta NOT IN ('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') AND FechaRegistro BETWEEN @tInicio AND @tFinal) AS FECHAS SET @columnas=LEFT(@columnas,len(@columnas)-1)
Un millón de gracias a quien me pueda dar una luz al respecto.