我有一个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 ...
问题是,当设置标准时,这将导致单个空记录的集合,因此不应包括任何分数/玩家。
有没有办法避免获取空记录而结果是空的而不是像这个例子一样?
答案 0 :(得分:1)
您可以围绕列包装ISNULL
函数。
ISNULL(Avg(Case When Score1> 0 then Score1 end),'')
如果第一个参数返回NULL值,它将被第二个参数替换。
答案 1 :(得分: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()
只是一个占位符,用于输出字符串的首选方法,如果您决定沿着此路线前进。
答案 2 :(得分: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
--------- --------------- -----------------
是吗?
如果是这样,添加“HAVING”子句将使用NULLS过滤掉记录:
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