2014-10-30 57 views
2

我在要求有一個問題:條件子句中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(性別)...

我怎樣才能做到這一點?

感謝您的幫助

回答

2

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

1

嘗試這種情況:

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