Hola a todos buenos días. Tengo un problema soberano con un SQL Dinámico. Tengo el siguiente SQL:
Código SQL:
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
***************************************************************
***************************************************************[
/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 originalDECLARE @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.