CASE

2013-05-16 4 views
0

를 사용하여 결과 테이블에 0 값을 얻기 나는 다음과 같은 테이블이 있습니다CASE

 State   Soccer players  Tennis players 
     CT     0     0   
     IL     5     10 
     IN     3     8 
     MI     12     14 
     OH     8     9 
     AR     2     2 
     KS     14     16 
     AL     8     7 
     CA     1     13 
     NV     2     3 

은 내가 노력하고

Region   Total_players 
East    0 
MidWest   60 
SouthWest   34 
West    29 
SouthEast   0 

아래 그림과 같은 출력 테이블을 형성하고 싶습니다를 East Region에서 어떤 선수도 갖지 못한 결과를 얻으려고합니다. 그러나, 나의 결과 세트에서 나는 "동쪽"을 얻지 않고있다.

나는 "동쪽"지역을 산출하지 않는 뒤에 오는 질문을 시도했다.

select CASE 
     WHEN STATE IN ('AL','FL','GA','KY','LA','MS','NC','SC','TN') THEN 'SE' 
     WHEN STATE IN ('IL','IN','MI','OH','WI') THEN 'MW' 
      WHEN STATE IN ('AR','KS','MO','OK','TX') THEN 'SW' 
      WHEN STATE IN ('CT') THEN 'E' 
      WHEN STATE IN ('CA','NV') THEN 'W' 
      ELSE 'Error' 
     END AS Region, 
     COUNT(*) as Total, 
     from players WHERE TRUNC(t.date) >= to_char(to_date(?,'DY MON DD HH24:MI:SS YYYY'),'DD-MON-YYYY') 
       and TRUNC(t.date) <= to_char(to_date(?,'DY MON DD HH24:MI:SS YYYY'),'DD-MON-YYYY') 
     GROUP BY ROLLUP(Region) ORDER BY Region 
+0

테이블과 진술이 일치하지 않습니다. 테이블에 '지역'열이 있습니까? 거기에 동쪽 지역이있는 행이 있습니까? – Ben

+0

예 지역이 테이블에 있습니다. 이스트는 단 하나의 레코드를 보유하고 있지만 두 플레이어 모두 0 명입니다. 그 정보도 검색하려고합니다. 희망이 도움이 희망 – Ryan

+0

에 대해 불분명. 당신은 지역이 위의 주석과 질문에 테이블에 있다고 말했다. 아래 답변에서 당신은 그것이 테이블에 없다고 말했습니다. –

답변

0

빠른 대답 :

당신은 동부 지역이 확실히 표시되지 않는 것 쉬운 이유는 당신의 WHERE 절을 의미 테이블의 행을 가지고 있다고 논평했다. 이것을 제거하면 영역이 다시 나타납니다. 당신 만이 그 절이 맞는지 알 수 있습니다.


이 답변에 대한 의견에 따라 지역 및 주에 대한 표가 필요하거나 작성해야합니다. 그것은 중요하지 않습니다. 첫째

당신은 지역에서 고유 테이블을 당신이 국가 수준에서 모든 정보를 저장하는 경우, 이것은 당신이 지역 수준

create table regions (
    region varchar2(10) 
    , ... 
    , constraint pk_regions primary key (region) 
    ); 

다음 한 상태에서 고유 모든 정보를 저장하는 곳이입니다 필요

create table states (
    state varchar2(20) 
    , ... 
    , constraint pk_states primary key (state) 
    ); 

그런 다음이 두 정보를 채우고 둘 사이에 조인하는 세 번째 테이블을 만들어야합니다.

create table region_states (
    region varchar2(10) 
    , state varchar2(20) 
    , constraint pk_region_states primary key (region, state) 
    , constraint fk_rs_regions foreign key (region) references regions (region) 
    , constraint fx_rs_states foreign key (state) references states (state) 
    ); 

다음 당신은 정말 자신의 STATES 테이블에 외래 키가 있어야합니다. 이것은 이지만 현재 테이블에 영향을 미칠 수 있으므로 신중하게 이동하십시오.

alter table your_table 
    add constraint fk_players 
     foreign key (state) 
     references states (state) 

마지막으로 정보를 얻으려면 REGION_STATES에 가입하십시오. 제발 또한 내가 SUM()를 사용 (COUNT 적이 없다하지 않는 것이

select rs.region, sum(p.soccer_players + p.tennis_players) as total_players 
    from players p 
    join region_states rs 
    on p.state = rs.state 
group by rs.region 

) ... 당신은 플레이어의 총 수를 원하는 데이터가 이미 국가 수준에서 COUNT()를 집계로 수를 계산 선수의 수가 아니라 국가의.

+0

죄송합니다. East Region은 원래 테이블에 없으며 Yes Region도 존재하지 않습니다. 저는 주립국, 축구 선수, 테니스 선수 만 있습니다. 친절하게 도와주세요. – Ryan

0

필요한 출력을 제공합니다. 테이블에없는 where 절의 날짜를 이해할 수 없습니다.

select CASE 
    WHEN STATE IN ('AL','FL','GA','KY','LA','MS','NC','SC','TN') THEN 'SE' 
    WHEN STATE IN ('IL','IN','MI','OH','WI') THEN 'MW' 
     WHEN STATE IN ('AR','KS','MO','OK','TX') THEN 'SW' 
     WHEN STATE IN ('CT') THEN 'E' 
     WHEN STATE IN ('CA','NV') THEN 'W' 
     ELSE 'Error' 
    END AS Region, 
    sum(soccer_players + tennis_players) as total_players, 
    from players 
    group by region 
1

플레이어 테이블에 동쪽 지역이없는 경우 다른 테이블에서 지역 목록을 가져와 쿼리 결과와 함께 왼쪽으로 가져와야합니다. 테이블을 생성하지 않으려는 경우 (예 : 한 번 보고서로) 당신이 좋아, 노동 조합 및 듀얼을 사용하여 테이블을 구성 할 수 있습니다 (이 지역에서 모든 행을 선택 쿼리를 만들 때

select region.long_name, region.short_name 
from (
    select 'SouthEast' long_name, 'SE' short_name from dual 
    union all 
    select 'MidWest' long_name, 'MW' short_name from dual 
    union all 
    select 'SouthWest' long_name, 'SW' short_name from dual 
    union all 
    select 'East' long_name, 'E' short_name from dual 
    union all 
    select 'West' long_name, 'W' short_name from dual 
) region 

더미 또는 실제 테이블 중 하나)을 선택하고 각 지역의 플레이어 합계로 왼쪽 가입을합니다.

select 
    region.long_name "Region", 
    sum (player.total_players) "Total players" 
from (
    select 'SouthEast' long_name, 'SE' short_name from dual 
    union all 
    select 'MidWest' long_name, 'MW' short_name from dual 
    union all 
    select 'SouthWest' long_name, 'SW' short_name from dual 
    union all 
    select 'East' long_name, 'E' short_name from dual 
    union all 
    select 'West' long_name, 'W' short_name from dual 
) region 
left join (
    select CASE 
     WHEN STATE IN ('AL','FL','GA','KY','LA','MS','NC','SC','TN') THEN 'SE' 
     WHEN STATE IN ('IL','IN','MI','OH','WI') THEN 'MW' 
     WHEN STATE IN ('AR','KS','MO','OK','TX') THEN 'SW' 
     WHEN STATE IN ('CT') THEN 'E' 
     WHEN STATE IN ('CA','NV') THEN 'W' 
     ELSE 'Error' 
    END region_short_name, 
    (players.soccer_players + players.tennis_players) total_players 
    from players 
    WHERE TRUNC(t.date) >= to_char(to_date(?,'DY MON DD HH24:MI:SS YYYY'),'DD-MON-YYYY') 
    and TRUNC(t.date) <= to_char(to_date(?,'DY MON DD HH24:MI:SS YYYY'),'DD-MON-YYYY') 
) player on player.region_short_name = region.short_name 
group by region.long_name