none
Realizar Consulta SQL contar cantidad de hijos RRS feed

  • Pregunta

  • Un saludos mis estimados

    Tengo dos tablas una llamada TRABAJADORES y otra llamada HIJOS
    Deseo realizar una consulta que me calcule la cantidad de hijos que tiene cada trabajador y muestre
    también una columna cuantos son menores a 18 años de edad

    TRABAJADORES        
    cod_trabajador nombre apellidos puesto fecha_ingreso
    100 JOSE RIVERA SUPERVISOR 1/10/2018
    101 MARIA WONG SECRETARIA 10/11/2017
    102 MARTIN MARTINES OPERARIO 10/11/2018
    HIJOS          
    cod_trabajador cod_hijos apellidos nombres fecha_nacimiento   EDAD
    100 1 RIVERA SMITH ANDREA 15/05/2005      13
    100 2 RIVERA SMITH MARCOS 13/08/1995      23
    100 3 RIVERA SMITH LUIS     17/01/2013       5
    102 1 MARTINES QUEZADA IVONE 18/01/2018       0
    101 1 PEREZ WONG DANIEL 5/05/1998      20
    RESULTADO        
    cod_trabajador nombre apellidos CANTIDAD_HIJOS CANT_MENOR_18_AÑOS
    100 JOSE RIVERA 3 2
    101 MARIA WONG 1 0
    102 MARTIN MARTINES 1 1

    miércoles, 19 de septiembre de 2018 4:56

Respuestas

  • Hola FranciscoRiver:

    Por ejemplo así:

    CREATE TABLE trabajadores
    (cod_trabajador INT,
     nombre         VARCHAR(100),
     apellidos      VARCHAR(100),
     puesto         VARCHAR(100),
     fechaingreso   DATE
    );
    CREATE TABLE hijos
    (cod_trabajador   INT,
     cod_hijos        INT,
     apellidos        VARCHAR(100),
     nombres          VARCHAR(100),
     fecha_nacimiento DATE,
     edad             INT
    );
    GO
    INSERT INTO trabajadores
    (cod_trabajador,
     nombre,
     apellidos,
     puesto,
     fechaingreso
    )
    VALUES
    (100,
     'JOSE',
     'RIVERA',
     'SUPERVISOR',
     '1/10/2018'
    ),
    (101,
     'MARIA',
     'WONG',
     'SECRETARIA',
     '10/11/2017'
    ),
    (102,
     'MARTIN',
     'MARTINES',
     'OPERARIO',
     '10/11/2018'
    );
    GO
    INSERT INTO hijos
    (cod_trabajador,
     cod_hijos,
     apellidos,
     nombres,
     fecha_nacimiento,
     edad
    )
    VALUES
    (100,
     1,
     'RIVERA SMITH',
     'ANDREA',
     '15/05/2005',
     13
    ),
    (100,
     2,
     'RIVERA SMITH',
     'MARCOS',
     '13/08/1995',
     23
    ),
    (100,
     3,
     'RIVERA SMITH',
     'LUIS',
     '17/01/2013',
     5
    ),
    (102,
     1,
     'MARTINES QUEZADA',
     'IVONE',
     '18/01/2018',
     0
    ),
    (101,
     1,
     'PEREZ WONG',
     'DANIEL',
     '5/05/1998',
     20
    );
    GO
    /* sentencia a aplicar */
    SELECT t.cod_trabajador,
           t.nombre,
           t.apellidos,
           COUNT(h.cod_trabajador) AS CANTIDAD_HIJOS,
           ISNULL(o.numero, 0) AS CANT_MENOR_18_AÑOS
    FROM trabajadores t
         INNER JOIN hijos h ON t.cod_trabajador = h.cod_trabajador
         LEFT JOIN
    (
        SELECT COUNT(*) numero,
               cod_trabajador
        FROM hijos
        WHERE edad < 18
        GROUP BY cod_trabajador
    ) AS o ON O.cod_trabajador = T.cod_trabajador
    GROUP BY t.cod_trabajador,
             t.nombre,
             t.apellidos,
             O.numero;

    Relacionas tu tabla trabajadores con los hijos, y haces una cuenta de los hijos, y para el numero menor de 18, le haces una tabla derivada, y la relacionas por la izquierda para que te de los que son menores.

    Un saludo

    • Marcado como respuesta FranciscoRiver miércoles, 19 de septiembre de 2018 14:27
    miércoles, 19 de septiembre de 2018 5:25
  • Trata:

    SELECT
        T.cod_trabajador,
        T.nombre,
        T.apellidos,
        ISNULL(H.num_hijos, 0) AS num_hijos,
        ISNULL(H.num_hijos_lt_18, 0) AS num_hijos_lt_18
    FROM
        trabajadores AS T
        LEFT OUTER JOIN
        (
        SELECT
     	cod_trabajador,
    	COUNT(*) AS num_hijos,
    	SUM(CASE WHEN edad < 18 THEN 1 ELSE 0 END) AS num_hijos_lt_18
        FROM
    	hijos
        GROUP BY
    	cod_trabajador
        ) AS H
        ON H.cod_trabajador = T.cod_trabajador
    ;


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta FranciscoRiver miércoles, 19 de septiembre de 2018 14:27
    miércoles, 19 de septiembre de 2018 12:43

Todas las respuestas

  • Hola FranciscoRiver:

    Por ejemplo así:

    CREATE TABLE trabajadores
    (cod_trabajador INT,
     nombre         VARCHAR(100),
     apellidos      VARCHAR(100),
     puesto         VARCHAR(100),
     fechaingreso   DATE
    );
    CREATE TABLE hijos
    (cod_trabajador   INT,
     cod_hijos        INT,
     apellidos        VARCHAR(100),
     nombres          VARCHAR(100),
     fecha_nacimiento DATE,
     edad             INT
    );
    GO
    INSERT INTO trabajadores
    (cod_trabajador,
     nombre,
     apellidos,
     puesto,
     fechaingreso
    )
    VALUES
    (100,
     'JOSE',
     'RIVERA',
     'SUPERVISOR',
     '1/10/2018'
    ),
    (101,
     'MARIA',
     'WONG',
     'SECRETARIA',
     '10/11/2017'
    ),
    (102,
     'MARTIN',
     'MARTINES',
     'OPERARIO',
     '10/11/2018'
    );
    GO
    INSERT INTO hijos
    (cod_trabajador,
     cod_hijos,
     apellidos,
     nombres,
     fecha_nacimiento,
     edad
    )
    VALUES
    (100,
     1,
     'RIVERA SMITH',
     'ANDREA',
     '15/05/2005',
     13
    ),
    (100,
     2,
     'RIVERA SMITH',
     'MARCOS',
     '13/08/1995',
     23
    ),
    (100,
     3,
     'RIVERA SMITH',
     'LUIS',
     '17/01/2013',
     5
    ),
    (102,
     1,
     'MARTINES QUEZADA',
     'IVONE',
     '18/01/2018',
     0
    ),
    (101,
     1,
     'PEREZ WONG',
     'DANIEL',
     '5/05/1998',
     20
    );
    GO
    /* sentencia a aplicar */
    SELECT t.cod_trabajador,
           t.nombre,
           t.apellidos,
           COUNT(h.cod_trabajador) AS CANTIDAD_HIJOS,
           ISNULL(o.numero, 0) AS CANT_MENOR_18_AÑOS
    FROM trabajadores t
         INNER JOIN hijos h ON t.cod_trabajador = h.cod_trabajador
         LEFT JOIN
    (
        SELECT COUNT(*) numero,
               cod_trabajador
        FROM hijos
        WHERE edad < 18
        GROUP BY cod_trabajador
    ) AS o ON O.cod_trabajador = T.cod_trabajador
    GROUP BY t.cod_trabajador,
             t.nombre,
             t.apellidos,
             O.numero;

    Relacionas tu tabla trabajadores con los hijos, y haces una cuenta de los hijos, y para el numero menor de 18, le haces una tabla derivada, y la relacionas por la izquierda para que te de los que son menores.

    Un saludo

    • Marcado como respuesta FranciscoRiver miércoles, 19 de septiembre de 2018 14:27
    miércoles, 19 de septiembre de 2018 5:25
  • Trata:

    SELECT
        T.cod_trabajador,
        T.nombre,
        T.apellidos,
        ISNULL(H.num_hijos, 0) AS num_hijos,
        ISNULL(H.num_hijos_lt_18, 0) AS num_hijos_lt_18
    FROM
        trabajadores AS T
        LEFT OUTER JOIN
        (
        SELECT
     	cod_trabajador,
    	COUNT(*) AS num_hijos,
    	SUM(CASE WHEN edad < 18 THEN 1 ELSE 0 END) AS num_hijos_lt_18
        FROM
    	hijos
        GROUP BY
    	cod_trabajador
        ) AS H
        ON H.cod_trabajador = T.cod_trabajador
    ;


    AMB

    Some guidelines for posting questions...

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

    • Marcado como respuesta FranciscoRiver miércoles, 19 de septiembre de 2018 14:27
    miércoles, 19 de septiembre de 2018 12:43
  • Perfecto, Muchas Gracias por el resultado
    miércoles, 19 de septiembre de 2018 14:27
  • Gracias por la respuesta
    miércoles, 19 de septiembre de 2018 14:28