2015-12-14 48 views
0

我已經有了一個基本查詢來從我的數據庫中選擇所有位置,然後按它們的郵編的前2個字符對它們進行分組。使用另一個GROUP BY過濾GROUP BY結果以進行修剪

SELECT LEFT(`locationPostcode`, 2) as `postcode`, count(`locationPostcode`) as `locationCount` 
FROM `locations` 
WHERE `locationPostcode` IS NOT NULL 
AND `locationPostcode` <> '' 
GROUP BY `postcode` 
ORDER BY `locationCount` DESC 

因爲有些郵政編碼僅1個字母字符,而不是2開始,我需要這組再次獲得這些郵政編碼(例如E1,W2),只顯示他們的第一個字母。

我在此嘗試將它們分組再次LEFT('postcode', 2),但它似乎並沒有產生太大的影響(下查詢)

SELECT postcode, locationCount FROM (

    SELECT LEFT(`locationPostcode`, 2) as `postcode`, count(`locationPostcode`) as `locationCount` 
    FROM `locations` 
    WHERE `locationPostcode` IS NOT NULL 
    AND `locationPostcode` <> '' 
    GROUP BY `postcode` 
    ORDER BY `locationCount` DESC 
    ) as `outer` 
GROUP BY left(`postcode`, 1) 
ORDER BY `locationCount` DESC 

澄清:我想我的實際郵編結果如下:

postcode | count 
---------------- 
E  | 3000 
W  | 2200 
SW  | 1300 

不是:

postcode | count 
---------------- 
SW  | 1300 
E1  | 1000 
E2  | 300 
S1  | 200 
S2  | 100 
S3  | 50 
+0

一般GROUP BY規則說:如果指定了GROUP BY子句,在SELECT列表中的每個列引用必須明確指出的一個分組列或成爲集合函數的參數。 – jarlh

+1

樣本數據和期望的結果將有所幫助。根據你所描述的,你不能在第一個查詢中用「1」代替「2」嗎? –

+0

這些似乎是英國郵政編碼,在這種情況下,您可以將數字1到9作爲第二個字符 – Shadow

回答

2

您的問題的描述表明了group by一個有條件的情況下:

SELECT (case when substr(locationPostcode, 2, 1) between 'A' and 'Z' 
      then left(`locationPostcode`, 2) 
      else left(locationPostcode, 1) 
     end) as postcode_prefix, count(`locationPostcode`) as `locationCount` 
FROM `locations` 
WHERE `locationPostcode` IS NOT NULL AND `locationPostcode` <> '' 
GROUP BY postcode_prefix 
ORDER BY `locationCount` DESC; 
+0

完美!正是我所需要的 - 作爲sql的新手,我沒有意識到條件可用 – Tom