2 votes

MySQL compte les instances de genre

J'ai la requête MySQL suivante.

USE demo;
SELECT 
  loc.name,
  sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
  sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
FROM case_report_main as cr 
JOIN location as loc on cr.cr_name = loc.name
GROUP BY loc.name

cela fonctionne comme je le souhaite, il compte chaque occurrence de chaque genre et les regroupe par nom de lieu. Mais lorsque j'essaie de la joindre à une autre table

USE demo;
SELECT 
  loc.name,
  sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
  sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
FROM case_report_main as cr 
JOIN location as loc on cr.cr_name=loc.name
JOIN map_polygons as mp on mp.polygon_name=loc.name
GROUP BY loc.name

les valeurs sont complètement faussées, renvoyant des milliers au lieu des dizaines et centaines attendues.

I pensez à Je comprends le problème, la table supplémentaire augmente le nombre de lignes. Je ne suis pas sûr de savoir comment le résoudre ou si c'est bien là le problème.

1voto

John Woo Points 132738

Car il peut y avoir des enregistrements qui ont des correspondances multiples dans la table map_polygons pour avoir des comptes invalides sur le sexe, essayez de mettre la première requête dans une sous-requête,

SELECT  mp.*,
        loc.name
        loc.`F#`
        loc.`M#`
FROM
        (
            SELECT  loc.name,
                    sum(case cr_sex when 'F' then 1 else 0 end) as 'F#', 
                    sum(case cr_sex when 'M' then 1 else 0 end) as 'M#'
            FROM case_report_main as cr 
            JOIN location as loc on cr.cr_name = loc.name
            GROUP BY loc.name
        ) loc
        INNER JOIN map_polygons mp on mp.polygon_name=loc.name 

au fait, comme c'est mysql, il est possible de résumer le résultat booléen pour le rendre plus court.

SELECT  mp.*,
        loc.name
        loc.`F#`
        loc.`M#`
FROM
        (
            SELECT  loc.name,
                    sum(cr_sex = 'F') as 'F#', 
                    sum(cr_sex = 'M') as 'M#'
            FROM case_report_main as cr 
            JOIN location as loc on cr.cr_name = loc.name
            GROUP BY loc.name
        ) loc
        INNER JOIN map_polygons mp on mp.polygon_name=loc.name

0voto

georgecj11 Points 1502

Dans la table map_polygon, le nom du polygone est-il unique ? S'il n'est pas unique, vous devez peut-être modifier les champs de sélection.

SELECT 
  loc.name,
  count(distinct case cr_sex when 'F' then cr.id else null end) as 'F#', 
  count(distinct case cr_sex when 'M' then cr.id else null end) as 'M#'
FROM case_report_main as cr 
JOIN location as loc on cr.cr_name=loc.name
JOIN map_polygons as mp on mp.polygon_name=loc.name
GROUP BY loc.name

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X