我有以下数据:
Name | Condition
Mike | Good
Mike | Good
Steve | Good
Steve | Alright
Joe | Good
Joe | Bad
我想编写if语句,如果Bad
存在,我想将名称归类为Bad
。如果Bad
不存在但Alright
存在,则归类为Alright
。如果仅存在Good
,则归类为good
。
所以我的数据会变成:
Name | Condition
Mike | Good
Steve | Alright
Joe | Bad
这在SQL中是否可行?
答案 0 :(得分:2)
如果您首先创建一个将 Condition 映射到 rank 号码的表格,那么Access查询会很容易。
Condition rank
--------- ----
Bad 1
Alright 2
Good 3
然后,GROUP BY
查询会为每个名称提供最低等级:
SELECT y.Name, Min(c1.rank) AS MinOfrank
FROM
[YourTable] AS y
INNER JOIN conditions AS c1
ON y.Condition = c1.Condition
GROUP BY y.Name;
如果要为这些排名显示 Condition 字符串,请再次加入条件表:
SELECT sub.Name, sub.MinOfrank, c2.Condition
FROM
(
SELECT y.Name, Min(c1.rank) AS MinOfrank
FROM
[YourTable] AS y
INNER JOIN conditions AS c1
ON y.Condition = c1.Condition
GROUP BY y.Name
) AS sub
INNER JOIN conditions AS c2
ON sub.MinOfrank = c2.rank;
对于那些条件字段的索引,性能应该没问题。
在我看来,这种方法也适用于问题中标记的其他数据库(MySQL和SQL Server)。
答案 1 :(得分:1)
您可以使用case语句对条件进行排名,然后使用max()或min()来汇总结果,然后以相同的格式将结果返回给用户。
查询:
SELECT [Name]
, case min(case condition when 'bad' then 0 when 'alright' then 1 else 2 end)
when 0 then 'bad' when 1 then 'alright' when 2 then 'good' end as Condition
from mytable
group by [name]
答案 2 :(得分:0)
mysql有一个IF函数。
在这里,看看它:See the Java versions here.