2011-11-29 130 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;