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名球员。我也在尝试检索这些信息。希望这能帮你弄清楚你想要什么。你在上面的评论和问题中都提到了该地区。在下面的回答中,你评论说它不在表中。我已经编辑了这个问题。希望现在天气转晴。我很抱歉误解了这个问题。东部地区不在原始表格中,是的,即使是东部地区也不存在。我只有州,足球运动员,网球运动员。好心帮忙