SQL Server - Pivot dinamico

 
Vista:

Pivot dinamico

Publicado por victor manuel (6 intervenciones) el 22/05/2013 18:29:56
hola buenas.

estoy tratando de realizar una referencia cruzada para poder ver 2 tablas modo reporte, necesito me ayuden.
con esta consulta :

Select R.Id_Empleado,E.Nom_Empleado,E.Ape_Empleado,P.Puesto, T.Turno ,R.FechaTurno FROM Registros R INNER JOIN Empleados E ON R.Id_Empleado=E.Id_Empleado INNER JOIN Puestos P ON E.Id_Puesto=P.Id_Puesto INNER JOIN Turnos T ON R.Id_Turno = T.Id_Turno

muestro:



como ven en la imagen muestro los datos hacia abajo tanto turnos como fechas, y lo que busco es mostrar el id , nombre, apellido, puesto y las fechas de cabezera con los turnos debajo un turno correspondiente a su fecha.

ejemplo esta tabla que encontre en la web



y que quede como esta:



lo que busco no es sumar datos sino cambiar su posicion ,solo es poner las fechas de cabezera y cada turno asociado a su fecha por debajo, la suma en este report no existe.

quedaria algo asi:

Id_Empleado Nom_Empleado Ape_Empleado Puesto [2013-05-27] [2013-05-28] [2013-05-29]

1 luis soto oficina 3 3 3


obviamente con las 7 fechas del 2013-05-27 al 2013-06-02, no coloque mas porq se desordenaria.

Espero me ayuden y orienten pues llevo semanas tratando de entender y dar solucion yo mismo , y ya se me ha hecho corto el tiempo!
Atte.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias Islas Gonzalez
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Pivot dinamico

Publicado por Isaias Islas Gonzalez (4558 intervenciones) el 22/05/2013 22:33:15
¿Buscaste en San Google?

http://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por victor manuel (6 intervenciones) el 23/05/2013 14:14:05
Si he buscado en San google.

El tema es que no logro comprender como hacerlo para la consulta que yo expongo. debido a esto recurro al foro.

gracias por la ayuda y tu tiempo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias Islas Gonzalez
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Pivot dinamico

Publicado por Isaias Islas Gonzalez (4558 intervenciones) el 23/05/2013 16:22:11
En la liga que te di, se explica claramente como hacer un PIVOT DINAMICO, ¿cual seria tu duda puntual?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por victor manuel (6 intervenciones) el 23/05/2013 18:24:11
todo es mi duda solo tengo una consulta tipo inner join que me devuelve valores

lo que veo en varios foros es que crean variables en tiempo de ejecución, entonces deberia crear una variable para

fecha inicio datetime, fechatermino datetime, datos varchar(1000) ?

el select lo tengo mas que claro el pivote deberia ser mis fechas que no se sumarian por lo tal no puedo usar la funcion de agregacion SUM creo que deberia usar MAX.

las fechas que debo mostrar son un maximo de 7, ya que cada usuario tendra fechas por todo los meses(un ingreso por dia).

todo esto me enreda y preciso orientacion o una explicacion a paso indicando su proceder y hecho.
desde ya gracias por tu tiempo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Isaias Islas Gonzalez
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Pivot dinamico

Publicado por Isaias Islas Gonzalez (4558 intervenciones) el 23/05/2013 19:58:07
Los formateos de ls fechas e importes, ademas de poner TOTALES, seria muy facil, ¿cierto?

Te pongo esta ayuda:

INSERT INTO Pivot_Table VALUES('JOSE','20060601', 1000)
INSERT INTO Pivot_Table VALUES('JOSE','20060602', 3000)
INSERT INTO Pivot_Table VALUES('JOSE','20060603', 4000)
INSERT INTO Pivot_Table VALUES('LUIS','20060601', 12000)
INSERT INTO Pivot_Table VALUES('LUIS','20060602', 15000)
INSERT INTO Pivot_Table VALUES('LUIS','20060603', 2000)
INSERT INTO Pivot_Table VALUES('LUIS','20060604', 800)
INSERT INTO Pivot_Table VALUES('LUZMA','20060601', 100)
INSERT INTO Pivot_Table VALUES('LUZMA','20060602', 300)


DECLARE @PivotColumnHeaders VARCHAR(MAX), @Start varchar(10), @End varchar(10)

--SET @Start = cast(DATEPART(Year,DateADD(Month,-13,GetDate())) as varchar(10)) + right(REPLICATE('0',2) + cast(DATEPART(Month,DateADD(Month,-13,GetDate())) as varchar(10)),2)
--SET @End = cast(DATEPART(Year,DateADD(Month,-1,GetDate())) as varchar(10)) + right(REPLICATE('0',2) + cast(DATEPART(Month,DateADD(Month,-1,GetDate())) as varchar(10)),2)

-- Setea los rangos de fecha
SET @Start = '20060601'
SET @End = '20060604'


SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast([Fecha] as varchar) + ']',
'[' + cast([Fecha] as varchar)+ ']'
)
FROM Pivot_Table
WHERE [Fecha] Between @Start and @End
Group By [Fecha]

DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
SELECT Cliente_Nombre, ' + @PivotColumnHeaders + '
FROM (
SELECT
Cliente_Nombre
,Importe
,Fecha
FROM Pivot_Table
Group by Cliente_Nombre,Importe, Fecha
) AS PivotData
PIVOT (
SUM(Importe)
FOR [Fecha] IN (
' + @PivotColumnHeaders + '
)
) AS PivotTable
Order By Cliente_Nombre
'
EXECUTE(@PivotTableSQL)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por victor manuel (6 intervenciones) el 23/05/2013 21:04:10
gracias de antemano he estado probando tu codigo y con modificacion, entendimiento , por fin logro comprender lo que hace he logrado no del todo el resultado , solo unas modificaciones en las consultas y listo , eso queda por parte m+ia, luego subo la parte final y los creditos a ti y tu tiempo que sin duda no lo has perdido conmigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por victor manuel (6 intervenciones) el 24/05/2013 18:51:39
Este el Codigo Final. El que modifique a mis necesidades, recalcando que no comprendia mucho esto analizando y analizando codigo y realizando pruebas llegue a el.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
DECLARE @PivotColumnHeaders VARCHAR(MAX), @Start varchar(10), @End varchar(10)
SET @Start = '20130527'
SET @End = '20130602'
SELECT @PivotColumnHeaders =
COALESCE(
@PivotColumnHeaders + ',[' + cast([FechaTurno] as varchar) + ']',
'[' + cast([FechaTurno] as varchar)+ ']'
)
FROM Registros
WHERE [FechaTurno] Between @Start and @End
Group By [FechaTurno]
DECLARE @PivotTableSQL NVARCHAR(MAX)
SET @PivotTableSQL = N'
SELECT  Id_Empleado,Nombre,Apellido,Puesto ,' + @PivotColumnHeaders + '
FROM (Select R.Id_Empleado ,E.Nom_Empleado as Nombre ,E.Ape_Empleado as Apellido,P.Puesto as Puesto, FechaTurno , T.Turno as tur
FROM Registros R INNER JOIN Empleados E ON R.Id_Empleado=E.Id_Empleado 
INNER JOIN Puestos P ON E.Id_Puesto=P.Id_Puesto INNER JOIN  Turnos T ON R.Id_Turno = T.Id_Turno
 Group by R.Id_Empleado,E.Nom_Empleado,E.Ape_Empleado,P.Puesto, FechaTurno,T.Turno
) AS PivotData
PIVOT (
MAX(tur)
FOR [FechaTurno] IN (
' + @PivotColumnHeaders + '
)
) AS PivotTable
Order By Id_Empleado
'
EXECUTE(@PivotTableSQL)


y aqui esta la captura de lo logrado .


Creditos a ti Quien me ayudo luego de visitar y visitar foros y de leer guias que comprendia poco. sugerencias aun acepto pues desde ahora comienza lo real, que es mostrarlo en un grid con parametros de id y tal vez la fecha de inicio y final.
gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por Alfredo Ruiz Barrueta (1 intervención) el 26/09/2014 20:46:37
Hace un rato me pidieron una consulta así, y quiero agradecerles por este post, me ha sido de muchísima ayuda!!!

Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por luis (1 intervención) el 17/10/2016 18:50:52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
declare @query varchar(4000)
declare @columna varchar(2000)
declare @fecha varchar(25)='16/10/2016'
select
@columna=stuff((select distinct'],['
+ m.logeo from Detalle_Pedidos d
INNER JOIN Mozo m
on d.idMozo=m.idMozo
AND d.flag='1'
WHERE
convert(Varchar, d.fecCre, 103) = @fecha
order by  '],['+ m.logeo  for xml path('') ),1,2,'')+']'
set @query ='select * from
(
select m.logeo, d.monto
from Detalle_Pedidos d
INNER JOIN Mozo m
on d.idMozo=m.idMozo
and d.flag=1
)t
pivot
(
sum(monto)
for logeo in ('+@columna+')
) as PivotTable
WHERE 
convert(Varchar, d.fecCre, 103) = '+@fecha+''
 
execute (@query)

y me sale este error amigo
Mens. 4104, Nivel 16, Estado 1, Línea 15
El identificador formado por varias partes "d.fecCre" no se pudo enlazar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Pivot dinamico

Publicado por gabriela (5 intervenciones) el 07/06/2018 04:02:54
yo he intentado lo mismo que desea hacer mi compañero pero no he tenido éxito he buscado en google ejemplos y adaptarlos pero me sale error tengo la siguiente consulta, en la cual quiero que las fechas sean mis columna imprimo mi @columns y sin problema me arroja

[01/01/2018],[02/01/2018],[03/02/2018],[19/05/2018] pero al intentar ponerlo en mi pivot me manda el siguiente error y no se porque me podria orientar

Msg 8114, Level 16, State 1, Line 12
Error converting data type nvarchar to date.
Msg 473, Level 16, State 1, Line 12
The incorrect value "19/05/2018" is supplied in the PIVOT operator.

declare @query varchar(4000)
declare @Columns varchar(2000)
--obtenemos las columnas de la pivot
select
@Columns=STUFF((select Distinct'],['
+ convert(varchar,Fecha,103) from ventas.dbo.Listado_año
order by '],['+ convert(varchar,Fecha,103) for XML PATH('') ),1,2,'')+']'

print (@columns)

set @query='Select * from
(
SELECT grupo, fecha, tarifa_id
FROM ventas.dbo.Listado_año
)t
PIVOT
(
--sumamos el valor a mostrar
sum(tarifa_id)
--ponemos el nombre de la variable
--de columnas
FOR fecha IN ('+@Columns+')

) AS PivotTable
'
print (@query)
execute (@Query)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar