0

次の表があります。

      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

プレイヤーがいない東部地域でも結果を出そうとしています。ただし、結果セットでは「東」を取得していません。

「東」リージョンを生成しない次のクエリを試しました。

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
4

3 に答える 3

1

プレーヤー テーブルに東部地域がない場合は、別のテーブルから地域のリストを取得し、クエリの結果と結合する必要があります。テーブルを作成したくない場合 (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
于 2013-05-16T10:09:46.710 に答える
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
于 2013-05-16T09:48:07.293 に答える