PostgreSQL,查询以计数特定性别机器的使用次数

时间:2019-11-28 19:17:04

标签: sql postgresql join group-by

我有4张桌子

  • 用法(idus,...,#idt,#idm)
  • 机器(idm,namem)
  • 培训(idt,...,#idu)
  • 用户(idu,..,性别)

我想将此查询(显示使用一台机器的次数)编辑为一个查询,该查询将显示特定性别使用该机器的次数。

例如:

machine    | male | female
-----------+------+----
treadmill  |  30  |  100
biceps m   | 150  |   22 

我的查询:

SELECT machines.namem as machine, COUNT(*)
FROM usages, machines
WHERE users.”#idm” = machines.idm 
GROUP BY machines
ORDER BY COUNT DESC;

感谢所有帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用条件聚合。从您的数据结构来看,您似乎需要携带4个表才能获得预期的结果:

select 
    m.namem as machine, 
    sum(case when u.gender = 'male' then 1 else 0 end) male,
    sum(case when u.gender = 'female' then 1 else 0 end) female
from 
    usages s
    inner join machines m on m.idm = s."#idm"
    inner join trainings t on t.idt = s."#idt"
    inner join users u on u.idu = t."#idu"
group by m.namem
order by count(*) desc;

旁注:

  • 总是使用显式连接(带有on子句)而不是老式的隐式连接(带有from子句的逗号),其语法在很久以前就不受欢迎了

  • 您的原始查询有缺陷:查询中未定义表users(在from子句中不存在),但是您与该表中的列相关,在{ {1}}和select子句

答案 1 :(得分:0)

只需执行以下操作:

SELECT m.namem as machine, gender, COUNT(*)
FROM usages u 
inner join machines m on u.[#idm]= m.idm 
inner join users uz on uz.idu = u.idus

GROUP BY m.namem, gender
ORDER BY 4  DESC;

答案 2 :(得分:0)

使用条件聚合:

SELECT m.namem as machine, COUNT(*),
       COUNT(*) FILTER (WHERE u.gender = 'F') as females,
       COUNT(*) FILTER (WHERE u.gender = 'M') as males
FROM usages us JOIN
     machines m
     on us.”#idm” = m.idm JOIN
     users u
     ON us.idu = u.idu
GROUP BY m.namen
ORDER BY COUNT(*) DESC;