SQL - 使用Group By和case

时间:2014-08-01 10:34:15

标签: sql syntax syntax-error

每当在SELECT语句之后编写CASE语句时,我经常看到CASE语句在SQL中写入GROUP BY。这是一个规则吗?或者,如果它具有一定的意义,那么何时应该在SQL中使用GROUP BY中的CASE语句?

例如

*

SELECT supplier_id,
CASE
  WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
  WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
END
FROM suppliers;
GROUP BY supplier_id
    CASE
         WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
         WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
    END*

当我删除在GROUP BY中编写的CASE语句时,查询不会产生所需的结果。为什么会这样?

1 个答案:

答案 0 :(得分:3)

大多数数据库引擎都有聚合查询的要求。 select中的所有列都必须位于group by子句中或包含在聚合函数中(例如min()max()等)。

这个要求在两种情况下放宽了。 MySQL将允许未聚合的列作为扩展。它选择一个任意值。 SQL标准允许您按表中的唯一ID进行分组,然后引用其他列(技术上称为"功能相关")。

因此,在大多数数据库中,从case中删除group by都会产生错误。在MySQL中,它将为每个supplier_id返回一行,并为第二列提供任意值。

对于您问题中的查询,写起来更容易:

SELECT distinct supplier_id,
       (CASE WHEN supplier_name = 'IBM' and supplier_type = 'Hardware' THEN 'North office'
             WHEN supplier_name = 'IBM' and supplier_type = 'Software' THEN 'South office'
        END)
FROM suppliers;