Problema con consulta

24/02/2010 - 21:06 por Javier | Informe spam
Hola Gente,
explico: estoy realizando una consulta en la cual se toman dos fechas, y se
hace una consulta a una tabla que tiene dos campos, fechapresentacion y
renuevaa, renuevaa posee 0/null o un valor mayor que 0 (si es 0/null es una
presentacion, si es mayor una renovacion), la consulta debe mostrar por año,
cuantas presentaciones y renovaciones se realizaron y al final el total por
rango
hasta ahora tengo un codigo que pondre al final con unas imagenes que
muestran resultado, el cual posee el error de que funcionan con solo un rango
de fechas, si modifico el rango, la visualizacion de la tabla resultante no
es correcta, aunque el dato total si es correcto

uso sql server 2005

CODIGO:

declare @uno datetime, @dos datetime

set @uno = '20040101'
set @dos = '20101231'

select
TIPOÊSE WHEN renuevaa > 0 then 'RENOVACION' else 'PRESENTACION' end
,total2010=count(CASE WHEN YEAR(fechapresentacion)='2010' THEN 1 ELSE NULL
END)
,total2009=count(CASE WHEN YEAR(fechapresentacion)='2009' THEN 1 ELSE NULL
END)
,total2008=count(CASE WHEN YEAR(fechapresentacion)='2008' THEN 1 ELSE NULL
END)
,total2007 =count(CASE WHEN YEAR(fechapresentacion)='2007' THEN 1 ELSE NULL
END)
,total2006 =count(CASE WHEN YEAR(fechapresentacion)='2006' THEN 1 ELSE NULL
END)
,total2005 =count(CASE WHEN YEAR(fechapresentacion)='2005' THEN 1 ELSE NULL
END)
,total2004 =count(CASE WHEN YEAR(fechapresentacion)='2004' THEN 1 ELSE NULL
END)
,total =count(1)
from marca
where fechapresentacion between @uno and @dos
group by (CASE WHEN renuevaa > 0 then 'RENOVACION' else 'PRESENTACION' end)

Imagen con resultado
http://www.techdevs.cl/Dibujo.PNG

ahora si modifico el rango ..supongamos 2003-2008, la tabla sigue igual
aunque los valores totales cambian
http://www.techdevs.cl/Dibujo2.PNG

especificando mas mi consulta existira alguna manera de hacer que el
resultado de la tabla muestre el rango especificado ?

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
24/02/2010 - 21:48 | Informe spam
Javier,

Cual version de sql server estas usando?

Parece que deseas crear las columnas de forma dinamica de acuerdo al rango
de las fechas. Es eso lo que deseas?

Si es asi, tendras que acudir a usar una operacion de pivot dinamica.

Para poderte ayudar mejor, preferible que postees la estructura de la tabla,
mas data de ejemplo en forma de sentencias insert.


AMB


"Javier" wrote:

Hola Gente,
explico: estoy realizando una consulta en la cual se toman dos fechas, y se
hace una consulta a una tabla que tiene dos campos, fechapresentacion y
renuevaa, renuevaa posee 0/null o un valor mayor que 0 (si es 0/null es una
presentacion, si es mayor una renovacion), la consulta debe mostrar por año,
cuantas presentaciones y renovaciones se realizaron y al final el total por
rango
hasta ahora tengo un codigo que pondre al final con unas imagenes que
muestran resultado, el cual posee el error de que funcionan con solo un rango
de fechas, si modifico el rango, la visualizacion de la tabla resultante no
es correcta, aunque el dato total si es correcto

uso sql server 2005

CODIGO:

declare @uno datetime, @dos datetime

set @uno = '20040101'
set @dos = '20101231'

select
TIPOÊSE WHEN renuevaa > 0 then 'RENOVACION' else 'PRESENTACION' end
,total2010=count(CASE WHEN YEAR(fechapresentacion)='2010' THEN 1 ELSE NULL
END)
,total2009=count(CASE WHEN YEAR(fechapresentacion)='2009' THEN 1 ELSE NULL
END)
,total2008=count(CASE WHEN YEAR(fechapresentacion)='2008' THEN 1 ELSE NULL
END)
,total2007 =count(CASE WHEN YEAR(fechapresentacion)='2007' THEN 1 ELSE NULL
END)
,total2006 =count(CASE WHEN YEAR(fechapresentacion)='2006' THEN 1 ELSE NULL
END)
,total2005 =count(CASE WHEN YEAR(fechapresentacion)='2005' THEN 1 ELSE NULL
END)
,total2004 =count(CASE WHEN YEAR(fechapresentacion)='2004' THEN 1 ELSE NULL
END)
,total =count(1)
from marca
where fechapresentacion between @uno and @dos
group by (CASE WHEN renuevaa > 0 then 'RENOVACION' else 'PRESENTACION' end)

Imagen con resultado
http://www.techdevs.cl/Dibujo.PNG

ahora si modifico el rango ..supongamos 2003-2008, la tabla sigue igual
aunque los valores totales cambian
http://www.techdevs.cl/Dibujo2.PNG

especificando mas mi consulta existira alguna manera de hacer que el
resultado de la tabla muestre el rango especificado ?
Respuesta Responder a este mensaje
#2 Javier
24/02/2010 - 22:27 | Informe spam
Hola gracias por tan pronta respuesta,
version es sql server 2005 , (sql server management studio express 9.00.4035)

y si, al parecer eso es lo que necesito columnas de forma dinámica de
acuerdo al rango de las fechas, buscare información sobre lo que me
recomiendas gracias

aqui coloco una estructura de la tabla con los datos necesarios para la
consulta y unos cuantos datos para "jugar"

create table marca(
fechapresentacion datetime,
renuevaa int
)
GO
insert marca values ('20030101',0)
insert marca values ('20030101',0)
insert marca values ('20030101',1)
insert marca values ('20030101',1)
insert marca values ('20030101',1)
insert marca values ('20040101',1)
insert marca values ('20040101',0)
insert marca values ('20040101',0)
insert marca values ('20040101',1)
insert marca values ('20040101',1)
insert marca values ('20050101',1)
insert marca values ('20050101',1)
insert marca values ('20050101',0)
insert marca values ('20050101',0)
insert marca values ('20050101',0)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',1)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20090101',1)
insert marca values ('20090101',0)
insert marca values ('20090101',1)
insert marca values ('20090101',1)
insert marca values ('20090101',0)
insert marca values ('20090101',1)
insert marca values ('20100101',0)
insert marca values ('20100101',0)
insert marca values ('20100101',0)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
GO
"Alejandro Mesa" wrote:

Javier,

Cual version de sql server estas usando?

Parece que deseas crear las columnas de forma dinamica de acuerdo al rango
de las fechas. Es eso lo que deseas?

Si es asi, tendras que acudir a usar una operacion de pivot dinamica.

Para poderte ayudar mejor, preferible que postees la estructura de la tabla,
mas data de ejemplo en forma de sentencias insert.


AMB
Respuesta Responder a este mensaje
#3 Alejandro Mesa
25/02/2010 - 02:47 | Informe spam
Javier,

Ve si esto te hes de ayuda.

USE tempdb;
GO
create table #marca(
fechapresentacion datetime,
renuevaa int
)
GO
SET NOCOUNT ON;
insert #marca values ('20030101',0)
insert #marca values ('20030101',0)
insert #marca values ('20030101',1)
insert #marca values ('20030101',1)
insert #marca values ('20030101',1)
insert #marca values ('20040101',1)
insert #marca values ('20040101',0)
insert #marca values ('20040101',0)
insert #marca values ('20040101',1)
insert #marca values ('20040101',1)
insert #marca values ('20050101',1)
insert #marca values ('20050101',1)
insert #marca values ('20050101',0)
insert #marca values ('20050101',0)
insert #marca values ('20050101',0)
insert #marca values ('20060101',1)
insert #marca values ('20060101',1)
insert #marca values ('20060101',1)
insert #marca values ('20060101',1)
insert #marca values ('20060101',1)
insert #marca values ('20070101',0)
insert #marca values ('20070101',0)
insert #marca values ('20070101',0)
insert #marca values ('20070101',0)
insert #marca values ('20070101',1)
insert #marca values ('20080101',0)
insert #marca values ('20080101',0)
insert #marca values ('20080101',0)
insert #marca values ('20080101',0)
insert #marca values ('20080101',0)
insert #marca values ('20090101',1)
insert #marca values ('20090101',0)
insert #marca values ('20090101',1)
insert #marca values ('20090101',1)
insert #marca values ('20090101',0)
insert #marca values ('20090101',1)
insert #marca values ('20100101',0)
insert #marca values ('20100101',0)
insert #marca values ('20100101',0)
insert #marca values ('20100101',1)
insert #marca values ('20100101',1)
insert #marca values ('20100101',1)
insert #marca values ('20100101',1)
SET NOCOUNT ON;
GO
DECLARE @sd datetime, @ed datetime;
DECLARE @columns_pvt nvarchar(MAX);
DECLARE @columns nvarchar(MAX);
DECLARE @sql nvarchar(MAX);
DECLARE @y int;

SELECT @sd = '20030101', @ed = '20081231';
SELECT @y = YEAR(@sd), @columns = N'', @columns_pvt = N'';

WHILE @y <= YEAR(@ed)
BEGIN
SET @columns_pvt = @columns_pvt + N',' + QUOTENAME(LTRIM(@y));
SET @columns = @columns + N',ISNULL(' + QUOTENAME(LTRIM(@y)) + N', 0)
AS' + QUOTENAME(LTRIM(@y));
SET @y = @y + 1;
END

SELECT @columns = STUFF(@columns, 1, 1, ''), @columns_pvt =
STUFF(@columns_pvt, 1, 1, '');

SET @sql = N'SELECT [TIPO],' + @columns + N'
FROM
(
SELECT
YEAR(fechapresentacion) AS Y,
CASE WHEN renuevaa > 0 THEN ''RENOVACION'' ELSE ''PRESENTACION'' END AS
TIPO,
1 AS c1
FROM
#marca
WHERE
fechapresentacion >= @sd AND fechapresentacion <= @ed
) AS T
PIVOT
(
SUM(c1)
FOR Y IN (' + @columns_pvt + N')
) AS P;';

EXEC sp_executesql @sql, N'@sd datetime, @ed datetime', @sd, @ed;
GO
DROP TABLE #marca;
GO


AMB


"Javier" wrote:

Hola gracias por tan pronta respuesta,
version es sql server 2005 , (sql server management studio express 9.00.4035)

y si, al parecer eso es lo que necesito columnas de forma dinámica de
acuerdo al rango de las fechas, buscare información sobre lo que me
recomiendas gracias

aqui coloco una estructura de la tabla con los datos necesarios para la
consulta y unos cuantos datos para "jugar"

create table marca(
fechapresentacion datetime,
renuevaa int
)
GO
insert marca values ('20030101',0)
insert marca values ('20030101',0)
insert marca values ('20030101',1)
insert marca values ('20030101',1)
insert marca values ('20030101',1)
insert marca values ('20040101',1)
insert marca values ('20040101',0)
insert marca values ('20040101',0)
insert marca values ('20040101',1)
insert marca values ('20040101',1)
insert marca values ('20050101',1)
insert marca values ('20050101',1)
insert marca values ('20050101',0)
insert marca values ('20050101',0)
insert marca values ('20050101',0)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20060101',1)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',0)
insert marca values ('20070101',1)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20080101',0)
insert marca values ('20090101',1)
insert marca values ('20090101',0)
insert marca values ('20090101',1)
insert marca values ('20090101',1)
insert marca values ('20090101',0)
insert marca values ('20090101',1)
insert marca values ('20100101',0)
insert marca values ('20100101',0)
insert marca values ('20100101',0)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
insert marca values ('20100101',1)
GO
"Alejandro Mesa" wrote:

> Javier,
>
> Cual version de sql server estas usando?
>
> Parece que deseas crear las columnas de forma dinamica de acuerdo al rango
> de las fechas. Es eso lo que deseas?
>
> Si es asi, tendras que acudir a usar una operacion de pivot dinamica.
>
> Para poderte ayudar mejor, preferible que postees la estructura de la tabla,
> mas data de ejemplo en forma de sentencias insert.
>
>
> AMB

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida