2015-07-21 37 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