none
Consulta avanzada RRS feed

  • Pregunta

  • Buenas Tarde
    Algún experto que me puede ayudar en esta consulta

    tengo dos tablas llamadas REFERENCIAS Y TRABAJADORES

    la consulta que deseo son cuatro lineas por trabajador (cuatro códigos tabla REFERENCIAS) donde se va a crear un campo dinamicamente llamado NUMERCION para enumerar los x trabajadores y un campo llamado CODIGO que contendrá el código según el criterio de la referencia todo esto lo obtendrá de la tabla TRABAJADORES. todos los campos son tipo texto, el único tipo numérico es TCodTra código del trabajador.

    ADJUNTO TABLAS

    REFERENCIA  
    RCodRef Rdescripcion
    01 Periodo Laboral
    03 Tipo de trabajador
    04 Regimen salud
    05 Regimen pensionario

    TRABAJADOR

                     
    TCodTra TNombres  TCategoria  TregPension  TRegSalud  TtipoTra  TfechaIngreso  TfechaTermino  Tcuspp Tcomision
    5675 JUAN       1       25      04     20     21/08/2018     31/12/2018 ABC1231213      01
    4532 ROSA       2       20      08     21     25/08/2018     31/11/2018 DGDFG45344      02
    6000 MARIA      1       02      01     20     26/08/2018     31/12/2019 XGT84848383      01

    resultado 

    Rdescripcion NUMERACION TCodTra TCategoria CODIGO RCodRef  TfechaIngreso  TfechaTermino  Tcuspp Tcomision
    Periodo Laboral 1 5675 1   01 21/08/2018    31/12/2018    
    Tipo de trabajador 1 5675 1   20 03 21/08/2018      
    Regimen salud 1 5675 1   04 04 21/08/2018      
    Regimen pensionario 1 5675 1   25 05 21/08/2018   ABC1231213         01
    Periodo Laboral 2 4532 2   01 25/08/2018    31/11/2018    
    Tipo de trabajador 2 4532 2   21 03 25/08/2018      
    Regimen salud 2 4532 2   08 04 25/08/2018      
    Regimen pensionario 2 4532 2   20 05 25/08/2018   DGDFG45344         02
    Periodo Laboral 3 6000 1   01 26/08/2018    31/12/2019    
    Tipo de trabajador 3 6000 1   20 03 26/08/2018      
    Regimen salud 3 6000 1   01 04 26/08/2018      
    Regimen pensionario 3 6000 1   02 05 26/08/2018   XGT84848383         01

    jueves, 27 de septiembre de 2018 19:29

Respuestas

  • Hola Francisco River:

    Adicionalmente a lo que te han comentado, su implementación puede ser así, pero yo no veo claro eso del código. Para las filigranas de ocultar fecha fin etc, utilizando lag y lead.

    USE foros;
    GO
    CREATE TABLE referencia
    (rcodRef      VARCHAR(2),
     Rdescripcion VARCHAR(50)
    );
    CREATE TABLE Trabajador
    (TcodTra        INT,
     Tnombres       VARCHAR(50),
     TCategoria     VARCHAR(50),
     TregPension    VARCHAR(50),
     TRegSalud      VARCHAR(50),
     TtipoTra       VARCHAR(50),
     TfechasIngreso DATE,
     TfechaTermin   DATE,
     Tcuspp         VARCHAR(50),
     Tcomision      VARCHAR(50)
    );
    GO
    INSERT INTO referencia
    (rcodRef,
     Rdescripcion
    )
    VALUES
    ('01',
     'Periodo Laboral'
    ),
    ('03',
     'Tipo de Trabajador'
    ),
    ('04',
     'Regimen salud'
    ),
    ('05',
     'Regimen pensionario'
    );
    INSERT INTO Trabajador
    (TcodTra,
     Tnombres,
     TCategoria,
     TregPension,
     TRegSalud,
     TtipoTra,
     TfechasIngreso,
     TfechaTermin,
     Tcuspp,
     Tcomision
    )
    VALUES
    (5675,
     'JUAN',
     '1',
     '25',
     '04',
     '20',
     '20180821',
     '20181231',
     'ABC1231213',
     '01'
    ),
    (4532,
     'ROSA',
     '2',
     '20',
     '08',
     '21',
     '20180825',
     '20181130',
     'DGDFG45344',
     '02'
    ),
    (6000,
     'MARIA',
     '1',
     '02',
     '01',
     '20',
     '20180826',
     '20191231',
     'XGT84848383',
     '01'
    );
    GO
    ;WITH cte
         AS (
         SELECT r.Rdescripcion,
                t.TcodTra,
                t.TCategoria,
                t.TtipoTra,
                r.rcodRef,
                t.TfechasIngreso,
                t.TfechaTermin,
                t.Tcuspp,
                t.Tcomision,
                LAG(t.tcuspp) OVER(PARTITION BY TfechaTermin ORDER BY TfechaTermin) AS anterior,
                LEAD(t.tcuspp) OVER(PARTITION BY TFECHATERMIN ORDER BY TFECHATERMIN) AS siguiente
         FROM Trabajador t
              CROSS JOIN referencia r)
         SELECT c.Rdescripcion,
                DENSE_RANK() OVER(ORDER BY c.TfechasIngreso) AS Numeracion,
                c.TcodTra,
                c.rcodRef,
                c.TfechasIngreso,
                CASE
                    WHEN anterior IS NULL
                    THEN CAST(c.TfechaTermin AS VARCHAR(30))
                    ELSE ''
                END AS TfechaTermino,
                CASE
                    WHEN siguiente IS NULL
                    THEN c.Tcuspp
                    ELSE ''
                END AS Tcuspp,
                CASE
                    WHEN siguiente IS NULL
                    THEN c.Tcomision
                    ELSE ''
                END AS Tcomision
         FROM cte c;
    

    Salida:

    • Marcado como respuesta FranciscoRiver jueves, 27 de septiembre de 2018 21:07
    jueves, 27 de septiembre de 2018 20:40

Todas las respuestas

  • Parece que deseas un simple CROSS JOIN de ambas tablas y luego enumerar usnado la funcion DENSE_RANK().

    select *, dense_rank() over(order by trabajador.TCodTra) as numeracion
    from trabajador cross join referencia;


    AMB

    Some guidelines for posting questions...

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

    jueves, 27 de septiembre de 2018 19:51
  • Hola Francisco River:

    Adicionalmente a lo que te han comentado, su implementación puede ser así, pero yo no veo claro eso del código. Para las filigranas de ocultar fecha fin etc, utilizando lag y lead.

    USE foros;
    GO
    CREATE TABLE referencia
    (rcodRef      VARCHAR(2),
     Rdescripcion VARCHAR(50)
    );
    CREATE TABLE Trabajador
    (TcodTra        INT,
     Tnombres       VARCHAR(50),
     TCategoria     VARCHAR(50),
     TregPension    VARCHAR(50),
     TRegSalud      VARCHAR(50),
     TtipoTra       VARCHAR(50),
     TfechasIngreso DATE,
     TfechaTermin   DATE,
     Tcuspp         VARCHAR(50),
     Tcomision      VARCHAR(50)
    );
    GO
    INSERT INTO referencia
    (rcodRef,
     Rdescripcion
    )
    VALUES
    ('01',
     'Periodo Laboral'
    ),
    ('03',
     'Tipo de Trabajador'
    ),
    ('04',
     'Regimen salud'
    ),
    ('05',
     'Regimen pensionario'
    );
    INSERT INTO Trabajador
    (TcodTra,
     Tnombres,
     TCategoria,
     TregPension,
     TRegSalud,
     TtipoTra,
     TfechasIngreso,
     TfechaTermin,
     Tcuspp,
     Tcomision
    )
    VALUES
    (5675,
     'JUAN',
     '1',
     '25',
     '04',
     '20',
     '20180821',
     '20181231',
     'ABC1231213',
     '01'
    ),
    (4532,
     'ROSA',
     '2',
     '20',
     '08',
     '21',
     '20180825',
     '20181130',
     'DGDFG45344',
     '02'
    ),
    (6000,
     'MARIA',
     '1',
     '02',
     '01',
     '20',
     '20180826',
     '20191231',
     'XGT84848383',
     '01'
    );
    GO
    ;WITH cte
         AS (
         SELECT r.Rdescripcion,
                t.TcodTra,
                t.TCategoria,
                t.TtipoTra,
                r.rcodRef,
                t.TfechasIngreso,
                t.TfechaTermin,
                t.Tcuspp,
                t.Tcomision,
                LAG(t.tcuspp) OVER(PARTITION BY TfechaTermin ORDER BY TfechaTermin) AS anterior,
                LEAD(t.tcuspp) OVER(PARTITION BY TFECHATERMIN ORDER BY TFECHATERMIN) AS siguiente
         FROM Trabajador t
              CROSS JOIN referencia r)
         SELECT c.Rdescripcion,
                DENSE_RANK() OVER(ORDER BY c.TfechasIngreso) AS Numeracion,
                c.TcodTra,
                c.rcodRef,
                c.TfechasIngreso,
                CASE
                    WHEN anterior IS NULL
                    THEN CAST(c.TfechaTermin AS VARCHAR(30))
                    ELSE ''
                END AS TfechaTermino,
                CASE
                    WHEN siguiente IS NULL
                    THEN c.Tcuspp
                    ELSE ''
                END AS Tcuspp,
                CASE
                    WHEN siguiente IS NULL
                    THEN c.Tcomision
                    ELSE ''
                END AS Tcomision
         FROM cte c;
    

    Salida:

    • Marcado como respuesta FranciscoRiver jueves, 27 de septiembre de 2018 21:07
    jueves, 27 de septiembre de 2018 20:40
  • la consulta obtenida sale de esta manera:

    TCodTra TNombres TCategoria  TregPension  TRegSalud  TtipoTra  TfechaIngreso  TfechaTermino  Tcuspp Tcomision RCodRef Rdescripcion numeracion
    4532 ROSA ELENA   2 20   08 21 25/08/2018 31/11/2018 DGDFG45344   02 01 Periodo Laboral   1
    4532 ROSA ELENA   2 20   08 21 25/08/2018 31/11/2018 DGDFG45344   02 03 Tipo de trabajador   1
    4532 ROSA ELENA   2 20     08 21 25/08/2018 31/11/2018 DGDFG45344   02 04 Regimen salud   1
    4532 ROSA ELENA   2 20     08 21 25/08/2018 31/11/2018 DGDFG45344   02 05 Regimen pensionario   1
    5675 JUAN MIGUEL   1 25   04 20 21/08/2018 31/12/2018 ABC1231213   01 01 Periodo Laboral   2
    5675 JUAN MIGUEL   1 25   04 20 21/08/2018 31/12/2018 ABC1231213   01 03 Tipo de trabajador   2
    5675 JUAN MIGUEL   1 25   04 20 21/08/2018 31/12/2018 ABC1231213   01 04 Regimen salud   2
    5675 JUAN MIGUEL   1 25   04 20 21/08/2018 31/12/2018 ABC1231213   01 05 Regimen pensionario   2
    6000 MARIA   1 02   01 20 26/08/2018 31/12/2019 XGT84848383   01 01 Periodo Laboral   3
    6000 MARIA   1 02   01 20 26/08/2018 31/12/2019 XGT84848383   01 03 Tipo de trabajador   3
    6000 MARIA   1 02   01 20 26/08/2018 31/12/2019 XGT84848383   01 04 Regimen salud   3
    6000 MARIA   1 02   01 20 26/08/2018 31/12/2019 XGT84848383   01 05 Regimen pensionario   3

    Bueno Ahora como le indico que según el código de la referencia "RCodRef" salga de esta manera la consulta los campos que se mostrarían tal cual están son: TCodTra, TNombres,TCategoria,TfechaIngreso,RCodRef,Rdescripcion y numeracion

    y validar cuando el RCodRef ='01' mostrar solo TfechaTermino y nada en TregPension,TRegSalud,TtipoTra,Tcuspp y Tcomision
    RCodRef ='03' mostrar solo TtipoTra y nada en TregPension,TRegSalud,TfechaTermino,Tcuspp y Tcomision
    RCodRef ='04' mostrar solo TRegSalud y nada en TregPension,TtipoTra,TfechaTerminoTcuspp y Tcomision
    RCodRef ='05' mostrar solo TregPension, Tcuspp Tcomision y nada en TRegSalud,TtipoTra y TfechaTermino

    Tal como se muestra la tabla, le agradecería mucho

    TCodTra TNombres TCategoria  TregPension  TRegSalud  TtipoTra  TfechaIngreso  TfechaTermino  Tcuspp Tcomision RCodRef Rdescripcion numeracion
    4532 ROSA ELENA    2       25/08/2018 31/11/2018     01 Periodo Laboral   1
    4532 ROSA ELENA    2       21 25/08/2018       03 Tipo de trabaja   1
    4532 ROSA ELENA    2   08   25/08/2018       04 Regimen salud   1
    4532 ROSA ELENA    2    20     25/08/2018   DGDFG45344    02 05 Regimen pension   1
    5675 JUAN MIGUEL    1       21/08/2018 31/12/2018     01 Periodo Laboral   2
    5675 JUAN MIGUEL    1       20 21/08/2018       03 Tipo de trabaja   2
    5675 JUAN MIGUEL    1   04   21/08/2018       04 Regimen salud   2
    5675 JUAN MIGUEL    1    25     21/08/2018   ABC1231213    01 05 Regimen pension   2
    6000 MARIA    1       26/08/2018 31/12/2019     01 Periodo Laboral   3
    6000 MARIA 1       20 26/08/2018       03 Tipo de trabaja   3
    6000 MARIA 1   01   26/08/2018       04 Regimen salud   3
    6000 MARIA 1    02     26/08/2018   XGT84848383     01 05 Regimen pension   3

    • Propuesto como respuesta Jorge Mori jueves, 27 de septiembre de 2018 21:22
    jueves, 27 de septiembre de 2018 20:52
  • Muchas Gracias!!!, es lo que necesitaba saludos
    jueves, 27 de septiembre de 2018 21:08