Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在结果用例中获取表的零值_Sql_Oracle_Oracle10g - Fatal编程技术网

Sql 在结果用例中获取表的零值

Sql 在结果用例中获取表的零值,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有下表: State Soccer players Tennis players CT 0 0 IL 5 10 IN 3 8 MI 12

我有下表:

      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
快速回答:

您评论说East区域在您的表中肯定有一行,这意味着它没有显示的原因很简单,就是您的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)
最后,为了获得信息,你加入了地区国家

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

请也不要说我用的是总和而不是计数。。。您需要玩家总数,并且由于数据已经在州一级聚合,计数计数的是州数,而不是玩家数。

它将给出所需的输出。无法理解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

如果玩家表中缺少East region,则必须从另一个表中获取区域列表,并与查询结果左键联接。 如果不想创建表(如一次性报告),可以使用union和dual构造表,如:

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

你的表和你的陈述不匹配。是表中的列区域吗?有一行是东区吗?是的,表中有东区。东部只有一项记录,但都有0名球员。我也在尝试检索这些信息。希望这能帮你弄清楚你想要什么。你在上面的评论和问题中都提到了该地区。在下面的回答中,你评论说它不在表中。我已经编辑了这个问题。希望现在天气转晴。我很抱歉误解了这个问题。东部地区不在原始表格中,是的,即使是东部地区也不存在。我只有州,足球运动员,网球运动员。好心帮忙