none
Pivot con 2 Campos Fechas RRS feed

  • Pregunta

  • necesito hacer Pivot de mi Tabla contratos  los campos  Fec_Ingreso,Fec_termino 

    Tabla Trabajador :

    Codigo,Trabajador, DNI

    Trabajador,DNI, Fec_Ingreso,Fec_termino

    los datos q deseo mostrar es de la siguiente manera:


    Trabajador  DNI            FECHA INICIO   FECHA FIN    FECHA INICIO FECHA FIN .................................

    NOMBRE    12345678   01/01/2015     04/01/2015  01/05/2015   31/08/2015

    Si Alguin pudiera ayudarme lo agradeceria

    jueves, 28 de mayo de 2015 17:32

Respuestas

  • Hola Mechito:

    La respuesta que te da Hunchback es la correctaluego tienes que saber cuanto es el máximo de veces que se puede llegar a contratar un empleado. para que hagas el CASE que te propone.

    Saludos cordiales,


    Camilo Villa

    • Marcado como respuesta Mechito78 viernes, 29 de mayo de 2015 2:34
    • Desmarcado como respuesta Mechito78 viernes, 29 de mayo de 2015 2:35
    • Marcado como respuesta Mechito78 sábado, 30 de mayo de 2015 17:10
    viernes, 29 de mayo de 2015 0:13
  • Aca tienes una possible solucion.

    SET NOCOUNT ON;
    GO
    CREATE TABLE #T(
    [CODIGO] [int] NOT NULL,
    [APELLIDOS] [nvarchar](80) NULL,
    [NOMBRES] [nvarchar](80) NULL,
    [DNI] [nvarchar](8) NULL,
    [RUC] [nvarchar](12) NULL,
    CONSTRAINT [PK_Trabajador] PRIMARY KEY CLUSTERED 
        (
        [CODIGO] ASC
        )
    )
    GO
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (1, N'RODRIGUEZ LOPES', N'LUISA', N'12345678', N'10123456789')
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (2, N'BECERRA NAVARRO', N'RAFAEL', N'15876355', N'10158763558')
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (3, N'ANDRES CIUDAD', N'ANA', N'89635634', N'1089635634')
    GO
    CREATE TABLE #C(
    [IDCONTRATO] [int] NOT NULL,
    [CODTRABAJADOR] [int] NULL,
    [FECINICIO] [smalldatetime] NULL,
    [FECFIN] [smalldatetime] NULL,
    [AREA] [nvarchar](50) NULL,
    [CARGO] [nvarchar](50) NULL,
    CONSTRAINT [PK_Contrato] PRIMARY KEY CLUSTERED 
        (
        [IDCONTRATO] ASC
        )
    ) ON [PRIMARY]
    GO
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (1, 1, CAST(0xA4130000 AS SmallDateTime), CAST(0xA44D0000 AS SmallDateTime), N'ALMACEN', N'ALMACENERO')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (2, 1, CAST(0xA46D0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'CONTABILIDAD', N'AUXILIAR')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (3, 2, CAST(0xA41C0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'INFORMATICA', N'CHOFER')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (4, 1, CAST(0xA48C0000 AS SmallDateTime), CAST(0xA5040000 AS SmallDateTime), N'CONTABILIDA', N'AUXILIAR')
    GO
    DECLARE
        @CODTRABAJADOR int,
        @cols nvarchar(MAX),
        @sql nvarchar(MAX);
    
    -- trabajador con maximo # de contratos
    SET @CODTRABAJADOR = (
    SELECT TOP (1)
        [CODTRABAJADOR]
    FROM
    	#C
    GROUP BY
        [CODTRABAJADOR]
    ORDER BY
        COUNT(*) DESC,
        [CODTRABAJADOR]
    );
    
    -- generar columnas
    WITH R AS (
    SELECT
    	ROW_NUMBER() OVER(ORDER BY FECINICIO) AS rn
    FROM
    	#C
    WHERE
        CODTRABAJADOR = @CODTRABAJADOR
    )
    SELECT @cols = STUFF(
    (
    SELECT
    	',MAX(CASE WHEN rn = ' + CAST(rn AS varchar(10)) + ' THEN FECINICIO END) AS C' + CAST(rn AS varchar(10)) + '_FI,' +
    	'MAX(CASE WHEN rn = ' + CAST(rn AS varchar(10)) + ' THEN [FECFIN] END) AS C' + CAST(rn AS varchar(10)) + '_FF'
    FROM
    	R
    ORDER BY
        rn
    FOR XML PATH('')
    ), 1, 1, '');
    
    -- armar sql
    SET @sql = N'
    WITH R AS (
    SELECT
    	T.CODIGO,
    	T.DNI,
    	C.FECINICIO,
    	C.FECFIN,
    	ROW_NUMBER() OVER(PARTITION BY T.CODIGO ORDER BY C.FECINICIO) AS rn
    FROM
    	#T AS T
    	LEFT OUTER JOIN
    	#C AS C
    	ON C.CODTRABAJADOR = T.CODIGO
    )
    SELECT
    	CODIGO,
    	DNI,' + @cols + N'
    FROM
    	R
    GROUP BY
    	CODIGO,
    	DNI;';
    
    --SELECT @sql;
    
    -- ejecutar sql
    EXEC sp_executesql @sql;
    GO
    DROP TABLE #T, #C;
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP viernes, 29 de mayo de 2015 14:04
    • Marcado como respuesta Mechito78 sábado, 30 de mayo de 2015 17:10
    viernes, 29 de mayo de 2015 13:55

Todas las respuestas

  • Puedes postear la estructura de la table, data de ejemplo en forma de sentencias INSERT asi como el resultado esperado?

    Por ahora trata:

    with R as (
    select trabajador, dni, fec_ingreso, fec_termino, row_number() over(partition by trabajador, dni order by fec_ingreso) as rn
    from Trabajador
    )
    select trabajador, dni,
        max(case when rn = 1 then fec_ingreso end) as fi_1,
        max(case when rn = 1 then fec_termino end) as ft_1,
        ...
        max(case when rn = n then fec_ingreso end) as fi_n,
        max(case when rn = n then fec_termino end) as ft_n
    from R
    group by dni, trabajador;

    Como no sabemos a prioris el numero de filas por cada par (trabajador, dni) entonces podrias usar pivot dinamico.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    • Propuesto como respuesta Camilo A. Villa viernes, 29 de mayo de 2015 0:13
    jueves, 28 de mayo de 2015 17:42
  • Muchas Gracias por tu apoyo ahi te envio la estructutra de las Tablas

    USE [BDADMIN]
    GO
    /****** Object:  Table [dbo].[Trabajador]    Script Date: 05/28/2015 14:47:57 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Trabajador](
    [CODIGO] [int] NOT NULL,
    [APELLIDOS] [nvarchar](80) NULL,
    [NOMBRES] [nvarchar](80) NULL,
    [DNI] [nvarchar](8) NULL,
    [RUC] [nvarchar](12) NULL,
     CONSTRAINT [PK_Trabajador] PRIMARY KEY CLUSTERED 
    (
    [CODIGO] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    INSERT [dbo].[Trabajador] ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (1, N'RODRIGUEZ LOPES', N'LUISA', N'12345678', N'10123456789')
    INSERT [dbo].[Trabajador] ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (2, N'BECERRA NAVARRO', N'RAFAEL', N'15876355', N'10158763558')
    INSERT [dbo].[Trabajador] ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (3, N'ANDRES CIUDAD', N'ANA', N'89635634', N'1089635634')
    /****** Object:  Table [dbo].[Contrato]    Script Date: 05/28/2015 14:47:56 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Contrato](
    [IDCONTRATO] [int] NOT NULL,
    [CODTRABAJADOR] [int] NULL,
    [FECINICIO] [smalldatetime] NULL,
    [FECFIN] [smalldatetime] NULL,
    [AREA] [nvarchar](50) NULL,
    [CARGO] [nvarchar](50) NULL,
     CONSTRAINT [PK_Contrato] PRIMARY KEY CLUSTERED 
    (
    [IDCONTRATO] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    INSERT [dbo].[Contrato] ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (1, 1, CAST(0xA4130000 AS SmallDateTime), CAST(0xA44D0000 AS SmallDateTime), N'ALMACEN', N'ALMACENERO')
    INSERT [dbo].[Contrato] ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (2, 1, CAST(0xA46D0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'CONTABILIDAD', N'AUXILIAR')
    INSERT [dbo].[Contrato] ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (3, 2, CAST(0xA41C0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'INFORMATICA', N'CHOFER')
    INSERT [dbo].[Contrato] ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (4, 1, CAST(0xA48C0000 AS SmallDateTime), CAST(0xA5040000 AS SmallDateTime), N'CONTABILIDA', N'AUXILIAR')

    lO QUE DESEO MOSTRAR ES UN HISTORIAL DE LOS CONTRATOS DE LOS TRABAJADORES 

    SI UN TRABAJADOR HA SIDO CONTRATADO POR EJEMPLO 5 VECES EN LA EMPRESA.

    NOMBRE              DNI              F.INICIO-1       FECFIN-1          F.INICIO-2   FEC.FIN-2      -- ---F.INICIO-5 FECFIN5

    TRABADOR1    12345678     01/01/2015       30/01/2015      02/02/2015   30/04/2015     01/06/2015  30/11/2015         

    MUCHAS GRACIAS POR TU APOYO AMIGO

    jueves, 28 de mayo de 2015 19:55
  • Hola Mechito:

    La respuesta que te da Hunchback es la correctaluego tienes que saber cuanto es el máximo de veces que se puede llegar a contratar un empleado. para que hagas el CASE que te propone.

    Saludos cordiales,


    Camilo Villa

    • Marcado como respuesta Mechito78 viernes, 29 de mayo de 2015 2:34
    • Desmarcado como respuesta Mechito78 viernes, 29 de mayo de 2015 2:35
    • Marcado como respuesta Mechito78 sábado, 30 de mayo de 2015 17:10
    viernes, 29 de mayo de 2015 0:13
  • Aca tienes una possible solucion.

    SET NOCOUNT ON;
    GO
    CREATE TABLE #T(
    [CODIGO] [int] NOT NULL,
    [APELLIDOS] [nvarchar](80) NULL,
    [NOMBRES] [nvarchar](80) NULL,
    [DNI] [nvarchar](8) NULL,
    [RUC] [nvarchar](12) NULL,
    CONSTRAINT [PK_Trabajador] PRIMARY KEY CLUSTERED 
        (
        [CODIGO] ASC
        )
    )
    GO
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (1, N'RODRIGUEZ LOPES', N'LUISA', N'12345678', N'10123456789')
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (2, N'BECERRA NAVARRO', N'RAFAEL', N'15876355', N'10158763558')
    INSERT #T ([CODIGO], [APELLIDOS], [NOMBRES], [DNI], [RUC]) VALUES (3, N'ANDRES CIUDAD', N'ANA', N'89635634', N'1089635634')
    GO
    CREATE TABLE #C(
    [IDCONTRATO] [int] NOT NULL,
    [CODTRABAJADOR] [int] NULL,
    [FECINICIO] [smalldatetime] NULL,
    [FECFIN] [smalldatetime] NULL,
    [AREA] [nvarchar](50) NULL,
    [CARGO] [nvarchar](50) NULL,
    CONSTRAINT [PK_Contrato] PRIMARY KEY CLUSTERED 
        (
        [IDCONTRATO] ASC
        )
    ) ON [PRIMARY]
    GO
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (1, 1, CAST(0xA4130000 AS SmallDateTime), CAST(0xA44D0000 AS SmallDateTime), N'ALMACEN', N'ALMACENERO')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (2, 1, CAST(0xA46D0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'CONTABILIDAD', N'AUXILIAR')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (3, 2, CAST(0xA41C0000 AS SmallDateTime), CAST(0xA48A0000 AS SmallDateTime), N'INFORMATICA', N'CHOFER')
    INSERT #C ([IDCONTRATO], [CODTRABAJADOR], [FECINICIO], [FECFIN], [AREA], [CARGO]) VALUES (4, 1, CAST(0xA48C0000 AS SmallDateTime), CAST(0xA5040000 AS SmallDateTime), N'CONTABILIDA', N'AUXILIAR')
    GO
    DECLARE
        @CODTRABAJADOR int,
        @cols nvarchar(MAX),
        @sql nvarchar(MAX);
    
    -- trabajador con maximo # de contratos
    SET @CODTRABAJADOR = (
    SELECT TOP (1)
        [CODTRABAJADOR]
    FROM
    	#C
    GROUP BY
        [CODTRABAJADOR]
    ORDER BY
        COUNT(*) DESC,
        [CODTRABAJADOR]
    );
    
    -- generar columnas
    WITH R AS (
    SELECT
    	ROW_NUMBER() OVER(ORDER BY FECINICIO) AS rn
    FROM
    	#C
    WHERE
        CODTRABAJADOR = @CODTRABAJADOR
    )
    SELECT @cols = STUFF(
    (
    SELECT
    	',MAX(CASE WHEN rn = ' + CAST(rn AS varchar(10)) + ' THEN FECINICIO END) AS C' + CAST(rn AS varchar(10)) + '_FI,' +
    	'MAX(CASE WHEN rn = ' + CAST(rn AS varchar(10)) + ' THEN [FECFIN] END) AS C' + CAST(rn AS varchar(10)) + '_FF'
    FROM
    	R
    ORDER BY
        rn
    FOR XML PATH('')
    ), 1, 1, '');
    
    -- armar sql
    SET @sql = N'
    WITH R AS (
    SELECT
    	T.CODIGO,
    	T.DNI,
    	C.FECINICIO,
    	C.FECFIN,
    	ROW_NUMBER() OVER(PARTITION BY T.CODIGO ORDER BY C.FECINICIO) AS rn
    FROM
    	#T AS T
    	LEFT OUTER JOIN
    	#C AS C
    	ON C.CODTRABAJADOR = T.CODIGO
    )
    SELECT
    	CODIGO,
    	DNI,' + @cols + N'
    FROM
    	R
    GROUP BY
    	CODIGO,
    	DNI;';
    
    --SELECT @sql;
    
    -- ejecutar sql
    EXEC sp_executesql @sql;
    GO
    DROP TABLE #T, #C;
    GO


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    • Editado HunchbackMVP viernes, 29 de mayo de 2015 14:04
    • Marcado como respuesta Mechito78 sábado, 30 de mayo de 2015 17:10
    viernes, 29 de mayo de 2015 13:55
  • Muchas Gracias por tu apoyo. me sirvicio para poder Realizar la Consulta q me habian solicitado.

    sábado, 30 de mayo de 2015 17:10
  • una consulta como podria agregar una fila en la COnsulta , TIEMPO CONTRATO:(FFIN-FINICIO) el resultado seria los dias transcurridos por contrato.

    Agradeceria mucho tu apoyo.

    lunes, 1 de junio de 2015 23:31