2012-10-12 3 views
0

이 글을 읽었지만 시도했을 때 제대로 작동하지 못합니다. 그래서 같은 테이블의 모든 남성과 여성을 계산하려면 :계산을 위해 2 대신 하나의 sql

Select 
count(case when substr(id,1, 1) in (1,2) then 1 else 0 end) as M, 
count(case when substr(id,1, 1) in (3,4) then 1 else 0 end) as F 
from users where activated=1 

ideea의 1 또는 2로 시작하는 ID를 가진 사용자가 세 남성 항목과 2 내 테이블
되어있다 남성이라는 것이다 활성화는 모든 입력을 감상 할 수있다

M,F 
2,2 

(일 어쩌려 구`t 경우 문을) 반환

id activated 
123 1 
234 0 
154 1 
+1

당신이 남성과 여성 일부 ID 샘플, 이야기를 보여줄 수 : 여기

은 예입니다? –

답변

4

대신 SUM을 사용해야합니다. COUNT은 모든 null이 아닌 값을 계산합니다. 오라클 버전은 나중에 10g 또는 인 경우

Select 
SUM(case when substr(id,1, 1) in (1,2) then 1 else 0 end) as M, 
SUM(case when substr(id,1, 1) in (3,4) then 1 else 0 end) as F 
from users where activated=1 
+0

나는 대답을 받아 들일 때까지 기다려야 만합니다. –

2

COUNT은 null이 아닌 값의 수를 알려줍니다. 대신 SUM을 시도하십시오.

+0

감사합니다. –

1

, 대안으로, 당신은 regexp_count 기능을 사용할 수 있습니다. 나는 ID 열이 number 데이터 유형이라고 가정합니다. 따라서이 예에서는 데이터 유형으로 명시 적으로 변환되어 TO_CHAR 함수를 사용합니다. ID 열의 데이터 형식이 varchar2 또는 char이면 모든 유형의 데이터 형식 변환이 필요하지 않습니다.

SQL> create table M_F(id, activated) as(
    2 select 123, 1 from dual union all 
    3 select 234, 0 from dual union all 
    4 select 434, 1 from dual union all 
    5 select 154, 1 from dual 
    6 ); 

Table created 

SQL> select sum(regexp_count(to_char(id), '^[12]')) as M 
    2  , sum(regexp_count(to_char(id), '^[34]')) as F 
    3 from M_F 
    4 where activated = 1 
    5 ; 

     M   F 
---------- ---------- 
     2   1 

Demo

+0

당신이이 문제에 대해 당신에게 감사드립니다. 나는 xdazz의 대답을 선택합니다. (너무 나쁜 것은 여러개를 선택할 수 없습니다.) 제 말의 사람이기 때문에. , 또한 regexp_count() 함수, verry nice를 알지 못했습니다. :) –

관련 문제