2011-11-29 127 views
2

在MySQL中,可以在SELECT子句中创建的GROUP BY子句中使用别名(参见MySQL Reference)。GROUP BY子句的别名?

我只是想知道为什么它不可能在GROUP BY中创建一个别名并在SELECT中使用它,它遵循SELECT语句的执行顺序。

换句话说,为什么下面不合语法?

SELECT region, SUM(population) 
    FROM population_us_states 
GROUP BY 
     CASE state_name 
       WHEN 'CT' THEN 'New England' 
       WHEN 'RI' THEN 'New England' 
       WHEN 'MA' THEN 'New England' 
       WHEN 'ME' THEN 'New England' 
       WHEN 'NH' THEN 'New England' 
       WHEN 'VT' THEN 'New England' 
       WHEN 'CA' THEN 'West Coast' 
       WHEN 'OR' THEN 'West Coast' 
       WHEN 'WA' THEN 'West Coast' 
     ELSE 'other' END AS region; 
+0

为了更好的可维护性,这真的应该在自己的表中。它可以提供更好的性能,尽管额外加入(据推测,这种方式可以通过优化器与havok进行分组) –

回答

4

使用嵌套SELECT - 外层一个上的内层一个以提取人口并生成所计算的列,然后可以GROUP BY该列:

SELECT region, SUM(population) FROM (

    SELECT CASE ... 

    ... AS region, population FROM population_us_states) 

GROUP BY region 
+0

@amemus:您的问题应该发给SQL标准委托人,我认为:) –

+0

关于第二个想法在我删除评论后),这可能是目前最聪明的解决方法。坚持当前的ANSI意味着我必须在SELECT和GROUP BY中编写两个相同的CASE表达式。谢谢,Alnitak。如果我问了这个问题,我不认为SQL委员会会花时间回答我,但我只是好奇...... – amemus

1

这是因为组由指主要条款,而不是反之亦然(或两者 - 两者之间的关系不是递归的)。

你可以在MySQL做到这一点,而不使用子查询,但您可以通过在申报值有组你的主要选择 - 所以你的初始查询是无效的,但下面应该是:

SELECT CASE state_name 
       WHEN 'CT' THEN 'New England' 
       WHEN 'RI' THEN 'New England' 
       WHEN 'MA' THEN 'New England' 
       WHEN 'ME' THEN 'New England' 
       WHEN 'NH' THEN 'New England' 
       WHEN 'VT' THEN 'New England' 
       WHEN 'CA' THEN 'West Coast' 
       WHEN 'OR' THEN 'West Coast' 
       WHEN 'WA' THEN 'West Coast' 
     ELSE 'other' END AS region, 
     SUM(population) 
    FROM population_us_states 
GROUP BY 
     region;