pivot

28/06/2007 - 11:08 por Clara | Informe spam
Hola, Tengo una tabla en SQL Server 2005 así

dtmFecha (sdmalldatetime) (Única)
intHE (int)
intHL (int)

con estos datos

dtmFecha intHE intHL
12/12/2005 1 3
13/12/2005 5 6
14/12/2005 6 8

y quiero obtener 2 registros a partir de una consulta en la que los
paramatros son 2 fechas: (Desde Hasta) algo así:

12/12/2005 13/12/2005 14/12/2005
1 5 6 (valores
de intHE)
3 6 8 (valores
de intHL)

He estado mirando en los BOL lo del Pivot (a raiz de un mensaje de hace unos
dias "transponer tabla"), pero no consigo montarla
Alguien me hecha una mano?

Grácias.

Preguntas similare

Leer las respuestas

#1 Maxi
28/06/2007 - 15:06 | Informe spam
Hola, yo mas que pivot para este query en especial te recomendaria usar
esto:

http://www.microsoft.com/spanish/ms...J_2326.asp


-
Microsoft M.V.P en SQLServer
SQLTotal Consulting - Servicios en SQLServer
Email:
"Clara" escribió en el mensaje
news:
Hola, Tengo una tabla en SQL Server 2005 así

dtmFecha (sdmalldatetime) (Única)
intHE (int)
intHL (int)

con estos datos

dtmFecha intHE intHL
12/12/2005 1 3
13/12/2005 5 6
14/12/2005 6 8

y quiero obtener 2 registros a partir de una consulta en la que los
paramatros son 2 fechas: (Desde Hasta) algo así:

12/12/2005 13/12/2005 14/12/2005
1 5 6 (valores
de intHE)
3 6 8 (valores
de intHL)

He estado mirando en los BOL lo del Pivot (a raiz de un mensaje de hace
unos dias "transponer tabla"), pero no consigo montarla
Alguien me hecha una mano?

Grácias.


Respuesta Responder a este mensaje
#2 Jesús López
28/06/2007 - 16:08 | Informe spam
Puede conseguirse esa consulta haciendo primero un UNPIVOT y luego un PIVOT,
pero debes conocer de antemano las fechas que van a salir. Si no, tendrás
que construir de forma dinámica la instrucción.

CREATE TABLE T
(
Fecha smalldatetime,
HE int,
HL int
)

INSERT INTO T VALUES('20051212', 1, 3)
INSERT INTO T VALUES('20051213', 5, 6)
INSERT INTO T VALUES('20051214', 5, 6)

;WITH CTE (Fecha, H, Valor)
AS
(
SELECT Fecha, H, Valor
FROM T
UNPIVOT (Valor FOR H IN (HE, HL)) AS UPVT
)
SELECT CONVERT(char(2), H) AS H, [20051212] AS [12 dic 2005], [20051213] AS
[13 dic 2005], [20051214] as [14 dic 2005]
FROM CTE
PIVOT (
MAX(Valor) FOR Fecha IN ( [20051212], [20051213], [20051214] )
) AS PVT

Lo que da como resultado:

H 12 dic 2005 13 dic 2005 14 dic 2005
HE 1 5 5
HL 3 6 6

(2 row(s) affected)

Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

"Clara" escribió en el mensaje
news:
Hola, Tengo una tabla en SQL Server 2005 así

dtmFecha (sdmalldatetime) (Única)
intHE (int)
intHL (int)

con estos datos

dtmFecha intHE intHL
12/12/2005 1 3
13/12/2005 5 6
14/12/2005 6 8

y quiero obtener 2 registros a partir de una consulta en la que los
paramatros son 2 fechas: (Desde Hasta) algo así:

12/12/2005 13/12/2005 14/12/2005
1 5 6 (valores
de intHE)
3 6 8 (valores
de intHL)

He estado mirando en los BOL lo del Pivot (a raiz de un mensaje de hace
unos dias "transponer tabla"), pero no consigo montarla
Alguien me hecha una mano?

Grácias.


Respuesta Responder a este mensaje
#3 Jesús López
28/06/2007 - 16:57 | Informe spam
Aquí está parametrizado usando ejecución dinámica:

CREATE TABLE T
(
Fecha smalldatetime UNIQUE,
HE int,
HL int
)

INSERT INTO T VALUES('20051212', 1, 3)
INSERT INTO T VALUES('20051213', 5, 6)
INSERT INTO T VALUES('20051214', 5, 6)

GO


CREATE PROCEDURE InformeX
@FechaIni smalldatetime,
@FechaFin smalldatetime
AS
DECLARE @Columnas varchar(max)
DECLARE @Valores nvarchar(max)

SET @Valores (SELECT ',' + '[' + CONVERT(varchar(8), Fecha, 112) + ']' AS [data()]
FROM T
WHERE Fecha BETWEEN @FechaIni AND @FechaFin
FOR XML PATH(''))
SET @Valores = STUFF(@Valores, 1, 1, '')

SET @Columnas (SELECT ',' + '[' + CONVERT(varchar(8), Fecha, 112) + '] AS [' +
CONVERT(varchar(10), Fecha, 103) + ']'
AS [data()]
FROM T
WHERE Fecha BETWEEN @FechaIni AND @FechaFin
FOR XML PATH(''))

DECLARE @sql nvarchar(max)
SET @sql = N'
;WITH CTE (Fecha, H, Valor)
AS
(
SELECT Fecha, H, Valor
FROM (SELECT * FROM T WHERE Fecha BETWEEN @FechaIni AND @FechaFin) AS S
UNPIVOT (Valor FOR H IN (HE, HL)) AS UPVT
)
SELECT CONVERT(char(2), H) AS H ' + @Columnas +
N'FROM CTE
PIVOT (
MAX(Valor) FOR Fecha IN (' + @Valores + N')
) AS PVT
'

exec sp_executesql @sql, N'@FechaIni smalldatetime, @FechaFin
smalldatetime',
@FechaIni, @FechaFin

GO

exec InformeX '20051212', '20051214'

exec InformeX '20051212', '20051212'

exec InformeX '20051212', '20051213'


De todas formas yo no lo haría así. Preferiría que fuera la aplicación
cliente quien manipulara el resultado para cambiar la presentación. Opino
que es más trabajo de la aplicación cliente formatear los resultados. El
PIVOT no es otra cosa que cambiar el aspecto de los datos.


Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com
Respuesta Responder a este mensaje
#4 Clara
28/06/2007 - 19:02 | Informe spam
Carai
Muchas grácias.
Si. creo que voy a hacer que sea la aplicación la formatee los datos.
De todas formas, voy a estudiar como trabaja esto.


"Jesús López" escribió en el mensaje
news:
Aquí está parametrizado usando ejecución dinámica:

CREATE TABLE T
(
Fecha smalldatetime UNIQUE,
HE int,
HL int
)

INSERT INTO T VALUES('20051212', 1, 3)
INSERT INTO T VALUES('20051213', 5, 6)
INSERT INTO T VALUES('20051214', 5, 6)

GO


CREATE PROCEDURE InformeX
@FechaIni smalldatetime,
@FechaFin smalldatetime
AS
DECLARE @Columnas varchar(max)
DECLARE @Valores nvarchar(max)

SET @Valores > (SELECT ',' + '[' + CONVERT(varchar(8), Fecha, 112) + ']' AS [data()]
FROM T
WHERE Fecha BETWEEN @FechaIni AND @FechaFin
FOR XML PATH(''))
SET @Valores = STUFF(@Valores, 1, 1, '')

SET @Columnas > (SELECT ',' + '[' + CONVERT(varchar(8), Fecha, 112) + '] AS [' +
CONVERT(varchar(10), Fecha, 103) + ']'
AS [data()]
FROM T
WHERE Fecha BETWEEN @FechaIni AND @FechaFin
FOR XML PATH(''))

DECLARE @sql nvarchar(max)
SET @sql = N'
;WITH CTE (Fecha, H, Valor)
AS
(
SELECT Fecha, H, Valor
FROM (SELECT * FROM T WHERE Fecha BETWEEN @FechaIni AND @FechaFin) AS S
UNPIVOT (Valor FOR H IN (HE, HL)) AS UPVT
)
SELECT CONVERT(char(2), H) AS H ' + @Columnas +
N'FROM CTE
PIVOT (
MAX(Valor) FOR Fecha IN (' + @Valores + N')
) AS PVT
'

exec sp_executesql @sql, N'@FechaIni smalldatetime, @FechaFin
smalldatetime',
@FechaIni, @FechaFin

GO

exec InformeX '20051212', '20051214'

exec InformeX '20051212', '20051212'

exec InformeX '20051212', '20051213'


De todas formas yo no lo haría así. Preferiría que fuera la aplicación
cliente quien manipulara el resultado para cambiar la presentación. Opino
que es más trabajo de la aplicación cliente formatear los resultados. El
PIVOT no es otra cosa que cambiar el aspecto de los datos.


Saludos:

Jesús López.
Solid Quality Mentors
www.solidq.com

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