使用SQL聚合文本数据

时间:2015-06-23 17:22:07

标签: mysql sql sql-server ms-access

我有以下数据:

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中是否可行?

3 个答案:

答案 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.