条件子句中COUNT

问题描述:

我在要求有一个问题:条件子句中COUNT

SELECT regionn, COUNT(regionn) AS total, 
COUNT(last_date_o) AS ouvreurs, 
COUNT(last_date_o)*100/COUNT(regionn) AS ratio, 
COUNT(gender='mr'), COUNT(gender='mme') 
FROM data WHERE length(regionn)=2 
GROUP BY regionn ORDER BY regionn ASC 

gender列有2个可能的值:“先生”或“MME”。 COUNT(gender ='mr'),COUNT(gender ='mme')我想要每个人的总数,但是相同的价值是回报。

事实上COUNT(性别= '先生'),COUNT(性别= 'MME')是完全一样的COUNT(性别),COUNT(性别)...

我怎样才能做到这一点?

感谢您的帮助

COUNT是不是这个合适的聚合器,你应该使用SUM

其实COUNT(gender='mr')COUNT(gender='mme')是完全一样COUNT(gender)

这是因为COUNT计数任何非NULL,而SUM加起来一和零。

SELECT 
    regionn 
, COUNT(regionn) AS total 
, COUNT(last_date_o) AS ouvreurs\ 
, COUNT(last_date_o)*100/COUNT(regionn) AS ratio 
, SUM(CASE WHEN gender='mr' THEN 1 ELSE 0 END) AS mrs 
, SUM(CASE WHEN gender='mme' THEN 1 ELSE 0 END) AS mmes 
FROM data 
WHERE length(regionn)=2 
GROUP BY regionn 
ORDER BY regionn ASC 
+0

感谢@dasblinkenlight,但我得到了“提示:没有函数匹配给定的名称和参数类型。你可能需要增加明确的类型转换。”在> SUM(性别...任何想法? – Macbernie 2014-10-30 13:52:17

+0

@Macbernie尝试更新的版本。我没有一个PostgreSQL实例得心应手尝试了这一点,但更新的表达应该从事的大多数RDBMS引擎。 – dasblinkenlight 2014-10-30 13:55:04

+0

你最后一次更新做的工作,即使是在我的PostgreSQL 9.1!感谢@dasblinkenlight – Macbernie 2014-10-30 17:12:51

尝试这种情况:

SELECT regionn, 
COUNT(regionn) AS total, 
COUNT(last_date_o) AS ouvreurs, 
COUNT(last_date_o)*100/COUNT(regionn) AS ratio, 
COUNT(gender='mr' or null), 
COUNT(gender='mme' or null) 
FROM data WHERE length(regionn)=2 
GROUP BY regionn ORDER BY regionn ASC 

解释为COUNT(gender='mr' or null)

对于gender == mr

count(gender='mr' or null) =>count('mr'='mr' or null) =>count(true or null) =>count(true) =>1

对于gender == mme

count(gender='mr' or null) =>count('mme'='mr' or null) =>count(false or null) =>count(null) =>0

这招使用的事实,true or null == truefalse or null == null

+0

它做的工作!这是什么疯狂?! – Macbernie 2014-10-30 17:10:51