es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Consulta una subconsulta con una declaración IF.

Necesito obtener los datos de religión (agama) de los estudiantes que se distribuyen según el año de registro. La religión de los estudiantes se reconoce por la clase de asignaturas elegidas por el estudiante.

Por favor, dime qué está mal en mi consulta con subconsulta.

SELECT 
  `subject_name` agama, 
  SUM(IF(YEAR(`reg_date`)=2017,1,0)) ts3,
  SUM(IF(YEAR(`reg_date`)=2018,1,0)) ts2,
  SUM(IF(YEAR(`reg_date`)=2019,1,0)) ts1,
  SUM(IF(YEAR(`reg_date`)=2020,1,0)) ts
  FROM (
    SELECT DISTINCT `st`.`reg_id`, `st`.`stname`, `st`.`reg_date`, `sj`.`subject_name`
    FROM `students` `st` 
    LEFT JOIN `class` `cl` USING (`reg_id`) 
    LEFT JOIN `subject` `sj` USING (`subject_id`)
    WHERE `st`.`status` = 'A'
    AND `sj`.`subject_name` LIKE '%agama%')

Obtengo un error de sintaxis que apunta al final de la consulta.

Error en la consulta (1064): Error de sintaxis cerca de ” en la línea 13

Si ejecuto la subconsulta por separado, obtengo una tabla de estudiantes con su religión como quiero, pero no dividida por año de registro.

Creo que hay una regla que desconozco sobre las subconsultas en SQL (MySQL).

Actualizado:

Muestra de la tabla que necesito crear:

Agama      2017  2018  2019  2020
Islam       18    11     15   12
Kristen     20    18      7   12
Katholik    22    26     11   16
Hindu        2     0      0    0
Buddha      28    26     16   20

Muestra del resultado de la subconsulta si se ejecuta por separado:

reg_id      stname                    reg_date     subject_name
---------+-------------------------+-------------+----------------------------
52017032    YOSUA MARCELL RUHUKAIL   2017-09-18    PENDIDIKAN AGAMA KRISTEN
52017035    HESTI ERINA TOBEOTO      2017-09-18    PENDIDIKAN AGAMA KRISTEN
52017014    GERALDI RADITYO WIWONO   2017-09-18    PENDIDIKAN AGAMA KATHOLIK
52017026    RIVALDO WINENGKO         2017-09-18    PENDIDIKAN AGAMA KATHOLIK
52017009    ARFIANDO KARSON EUGENA   2017-09-18    PENDIDIKAN AGAMA BUDDHA
52017016    HO LUSI                  2017-09-18    PENDIDIKAN AGAMA BUDDHA
52017027    RONALD KWANDY            2017-09-18    PENDIDIKAN AGAMA BUDDHA
52017031    YESSY                    2017-09-18    PENDIDIKAN AGAMA BUDDHA
51017002    ALIFKA GAUNG H           2017-09-18    PENDIDIKAN AGAMA ISLAM
51017003    AYU ARIYANINGSIH         2017-09-18    PENDIDIKAN AGAMA ISLAM
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con la consulta proporcionada:

    1. La subconsulta no está encerrada entre paréntesis, lo que causa un error de sintaxis al final de la consulta. La consulta corregida debería ser:
    SELECT 
      `subject_name` agama, 
      SUM(IF(YEAR(`reg_date`)=2017,1,0)) ts3,
      SUM(IF(YEAR(`reg_date`)=2018,1,0)) ts2,
      SUM(IF(YEAR(`reg_date`)=2019,1,0)) ts1,
      SUM(IF(YEAR(`reg_date`)=2020,1,0)) ts
    FROM (
      SELECT DISTINCT `st`.`reg_id`, `st`.`stname`, `st`.`reg_date`, `sj`.`subject_name`
      FROM `students` `st` 
      LEFT JOIN `class` `cl` USING (`reg_id`) 
      LEFT JOIN `subject` `sj` USING (`subject_id`)
      WHERE `st`.`status` = 'A'
      AND `sj`.`subject_name` LIKE '%agama%'
    ) `subquery`
    GROUP BY `subject_name`
    
    1. La subconsulta devuelve todos los estudiantes con su religión, pero no el número de estudiantes por religión por año. Para lograr esto, la subconsulta debe filtrar los resultados por año y la consulta principal debe agrupar los resultados por materia y año. Aquí tienes un ejemplo de cómo se puede modificar la subconsulta:
    SELECT DISTINCT
      `sj`.`subject_name`, 
      YEAR(`st`.`reg_date`) AS `year`
    FROM `students` `st` 
    LEFT JOIN `class` `cl` USING (`reg_id`) 
    LEFT JOIN `subject` `sj` USING (`subject_id`)
    WHERE `st`.`status` = 'A'
    AND `sj`.`subject_name` LIKE '%agama%'
    

    Esto debe devolver una tabla con dos columnas: subject_name y year. Luego puedes utilizar esto como una subconsulta en la consulta original para obtener el número de estudiantes por religión por año:

    SELECT 
      `subject_name` agama, 
      SUM(IF(`year`=2017,1,0)) ts3,
      SUM(IF(`year`=2018,1,0)) ts2,
      SUM(IF(`year`=2019,1,0)) ts1,
      SUM(IF(`year`=2020,1,0)) ts
    FROM (
      SELECT DISTINCT
        `sj`.`subject_name`, 
        YEAR(`st`.`reg_date`) AS `year`
      FROM `students` `st` 
      LEFT JOIN `class` `cl` USING (`reg_id`) 
      LEFT JOIN `subject` `sj` USING (`subject_id`)
      WHERE `st`.`status` = 'A'
      AND `sj`.`subject_name` LIKE '%agama%'
    ) `subquery`
    GROUP BY `subject_name`
    

    Esto debe darte la tabla deseada con datos de religión de los estudiantes distribuidos por año de registro.

Comments are closed.