2015-07-21 94 views
2

我有一个SQL查询是:SQL语句,返回空值,而不是空

SELECT Player, 
Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
Avg(Case When Score2> 0 then Score2 end) AS AverageScore2 
FROM scores 
WHERE .... various criteria ... 

的问题是,这将导致时设置的标准被设定为一个单一的,空的记录没有得分/播放器应该包括在内。

有没有办法避免得到一个空记录,结果是空的,而不是像这个例子?

enter image description here

+3

'HAVING AVG(案例当Score1> 0,则Score1结束)不NULL'? –

+0

你能否给出一个会导致不包含分数的标准示例? –

+0

@Samcd例如虽然愚蠢的一个WHERE Player ='xxx',并且没有播放器叫做xxx – RGriffiths

回答

1

你可以用绕柱的ISNULL功能。

ISNULL(Avg(Case When Score1> 0 then Score1 end),'') 

如果第一个参数返回NULL值,它将被第二个参数替换。

0

当你处理数字值时,没有“空”的东西。你可以最接近的是NULL,这就是你的表情回报。

如果你想要一个NULL值,那么你应该将值明确转换为一个字符串。这对于格式化原因很重要。您不指定您正在使用的数据库;大多数数据库都有格式化数字的方法。

的想法是这样的:

SELECT Player, 
     COALESCE(CAST(Avg(Case When Score1 > 0 then Score1 end) as VARCHAR(255)), '') AS AverageScore1, 
     COALESCE(CAST(Avg(Case When Score2 > 0 then Score2 end) as VARCHAR(255)), '') AS AverageScore2 
FROM scores 
WHERE .... various criteria ... 
GROUP BY Player; 

cast()仅仅是用于输出字符串,如果你决定走这条路线的首选方法的占位符。

+0

如果你看到我的编辑,你会看到我的意思是空的。我意识到SQL和MySQL可能有区别。已编辑的标签。 – RGriffiths

+0

@RichardGriffiths。 。 。添加'按玩家分组'。这应该能解决你的问题。 –

0

所以,你必须与此类似表设置:类似这样的

create table scores(
    Player varchar(20) not null, 
    score1 int not null, 
    score2 int not null 
); 

您的信息:

insert into scores(player, score1, score2) values('player 1', 0, 0); 
insert into scores(player, score1, score2) values('player 1', 10, 20); 
insert into scores(player, score1, score2) values('player 1', 20, 30); 

,并在运行类似于此条件的查询:

SELECT Player, 
    Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
    Avg(Case When Score2> 0 then Score2 end) AS AverageScore2 
FROM scores 
where Score1<10 and Score2<10 
GROUP BY Player 

你得到这样的输出:

Player  AverageScore1 AverageScore2 
--------- --------------- ----------------- 
Player1 NULL    NULL 

但你想要的是:

Player  AverageScore1 AverageScore2 
--------- --------------- ----------------- 

是吗?

如果是这样,加入了 “具有” 条款将过滤掉空值记录:

SELECT Player, 
    Avg(Case When Score1> 0 then Score1 end) AS AverageScore1, 
    Avg(Case When Score2> 0 then Score2 end) AS AverageScore2 
FROM scores 
where Score1<10 and Score2<10 
GROUP BY Player 
having Avg(Case When Score1> 0 then Score1 end) is not null and 
    Avg(Case When Score2> 0 then Score2 end) is not null