如何在GROUP BY子句中放入CASE语句

时间:2017-01-04 19:02:30

标签: mysql sql

我有一个包含一列的表,这是一个以逗号分隔的可能值列表。我想查询,按每个可能的值分组。

作为测试,我写了这个查询:

SELECT
    `Please_identify_which_of_the_following_classroom_hardware_you_c2`,
    count(`_How_would_you_rate_your_overall_skill_in_using_educational_tec1`) as count,
    `_How_would_you_rate_your_overall_skill_in_using_educational_tec1`
FROM
    `data_Copy_of_Faculty_survey_on_technology_in_the_classroom_Respo`
GROUP BY
    `_How_would_you_rate_your_overall_skill_in_using_educational_tec1`,
    CASE
        WHEN `Please_identify_which_of_the_following_classroom_hardware_you_c2` LIKE '%Elmo%' THEN 'Elmo'
    END

(请原谅列名,它们是自动生成的)

我知道CASE语句在这一点上并不是非常有用,但我只是想让查询运行。我收到了一个错误:

  

错误1064(42000):您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在第10行'THEN'Elmo'END'附近使用的语法

对于我的生活,我找不到查询的错误。任何见解都将不胜感激。

编辑:我尝试使用单引号和双引号 - 无论使用哪种引号都会出现同样的问题。

更新:正如Mark指出的那样,即使我要解析这个查询,结果也不会是我想要的。我仍然很好奇为什么这不解析,但查询不是我最初问题的解决方案。

2 个答案:

答案 0 :(得分:2)

您遇到问题的原因是您的GROUP BY属性未与SELECT属性保持一致。

作为MySql docs put it

"SQL92 and earlier does not permit queries for which 
the select list, HAVING condition, or ORDER BY list refer 
to nonaggregated columns that are neither named in the GROUP BY 
clause nor are functionally dependent on (uniquely determined by)
GROUP BY columns"

换句话说,由于...c2属性并非“功能依赖”您的CASE ... END属性,因此SELECTGROUP BY之间存在不匹配,因此错误。

缓解错误(并且可能使查询更具可读性)的一种方法是执行CASE一次,然后对结果关系进行聚合。

SELECT c2, tec1, COUNT(tec1)
FROM  
    (SELECT
       CASE 
         WHEN `Please_identify_which_of_the_following_classroom_hardware_you_c2` LIKE '%Elmo%' 
           THEN 'Elmo'
         ELSE
         `Please_identify_which_of_the_following_classroom_hardware_you_c2`
       END AS c2,
      `_How_would_you_rate_your_overall_skill_in_using_educational_tec1`) AS tec1
    FROM 
      `data_Copy_of_Faculty_survey_on_technology_in_the_classroom_Respo`) t
GROUP BY c2, tec1

答案 1 :(得分:1)

试试这个:

SELECT
    CASE
        WHEN `Please_identify_which_of_the_following_classroom_hardware_you_c2` LIKE '%Elmo%' THEN 'Elmo'
        ELSE `Please_identify_which_of_the_following_classroom_hardware_you_c2`
    END AS `Please_identify_which_of_the_following_classroom_hardware_you_c2`,
    count(`_How_would_you_rate_your_overall_skill_in_using_educational_tec1`) as count,
    `_How_would_you_rate_your_overall_skill_in_using_educational_tec1`
FROM
    `data_Copy_of_Faculty_survey_on_technology_in_the_classroom_Respo`
GROUP BY
    `_How_would_you_rate_your_overall_skill_in_using_educational_tec1`,
    CASE
        WHEN `Please_identify_which_of_the_following_classroom_hardware_you_c2` LIKE '%Elmo%' THEN 'Elmo'
    ELSE `Please_identify_which_of_the_following_classroom_hardware_you_c2`
        END