我有4张桌子
我想将此查询(显示使用一台机器的次数)编辑为一个查询,该查询将显示特定性别使用该机器的次数。
例如:
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;
感谢所有帮助。
答案 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;