簡體   English   中英

SQL語句中被零除如何避免特定記錄如果它返回被零除

[英]Division by zero in SQL statement how to avoid specific record if it returns division by zero

我試圖發表一個聲明,讓球員進球得分,然后按比賽進行划分。 如果玩家已經玩了 0 場比賽,就會出現 0 分局。 我如何“跳過”或忽略這一點並為每場比賽的目標顯示 N/A? 這是我目前擁有的:

SELECT PlayerName, PlayerSurname, GamesPlayed, GoalsScored, ROUND(GoalsScored/GamesPlayed ,2) AS GoalsPerGame
FROM tblPlayers , tblStatistics 
WHERE tblPlayers.PlayerID = tblStatistics.PlayerID 
ORDER BY GoalsScored DESC

我在 delphi 10.3 中這樣做,所以表的連接是在 where 語句中完成的,但這不會影響一般問題。 如果我為一張唱片做這件事,我會做的

if tblStatistics['GamesPlayed'] = 0 then
begin
qryStatsStatic.SQL.Clear;
qryStatsStatic.SQL.Add('
SELECT PlayerName, PlayerSurname, GamesPlayed, GoalsScored, "N/A" AS GoalsPerGame
FROM tblPlayers , tblStatistics 
WHERE tblPlayers.PlayerID = tblStatistics.PlayerID 
ORDER BY GoalsScored DESC');
qryStatistics.open;
end;

但我的問題是多條記錄。

您可以使用大多數流行的 DBMS 中存在的簡短nullif函數:

select
  ...,
  ROUND(GamesPlayed/nullif(GoalsScored, 0) ,2) as GoalsPerGame
...

SQL 有 CASE 語句,它只在找到匹配項之前執行。

CASE WHEN COALESCE(GamesPlayed,0) = 0 THEN 0
     ELSE ROUND(GoalsScored/GamesPlayed,2) 
END AS GoalsPerGame

每場比賽的目標也將是目標/游戲。

嘗試 SQL 聯合:

SELECT PlayerName, PlayerSurname, GamesPlayed, GoalsScored, 
       ROUND(GamesPlayed/GoalsScored ,2) AS GoalsPerGame
FROM tblPlayers , tblStatistics 
WHERE tblPlayers.PlayerID = tblStatistics.PlayerID
  AND GoalsScored <> 0
UNION
SELECT PlayerName, PlayerSurname, GamesPlayed, GoalsScored, 0
FROM tblPlayers , tblStatistics 
WHERE tblPlayers.PlayerID = tblStatistics.PlayerID
  AND GoalsScored = 0
ORDER BY GoalsScored DESC 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM