2013-03-21 91 views
0

我有一個表,看起來像這樣的MySQL到PostgreSQL查詢別名GROUP BY

 
id | number 
--------------- 
1  56721 
2  56722 
3  43981 
4  43982 
5  43983 
6  43984 

我的MySQL查詢看起來是這樣的:

SELECT CASE substr(number,1,2) WHEN '56' then 'class1' WHEN '43' then 'class2' else 'other' END as class, 
     CASE substr(number,3,2) WHEN '72' then 'subclass1', WHEN '98' then 'subclass2' ELSE 'other' END as subclass, count(id) as ct 
FROM table GROUP BY class, subclass HAVING class!='other' AND subclass!='other' 
ORDER BY class ASC, subclass DESC; 

,這是什麼相應的PostgreSQL的查詢?

回答

2

爲了使它更清晰,把它包裝上的子查詢:

SELECT class, subclass 
FROM 
    (
     SELECT CASE substr(number,1,2) WHEN '56' then 'class1' WHEN '43' then 'class2' else 'other' END as class, 
       CASE substr(number,3,2) WHEN '72' then 'subclass1', WHEN '98' then 'subclass2' ELSE 'other' END as subclass 
     FROM table 
    ) x 
GROUP BY class, subclass 
HAVING class != 'other' AND subclass != other 
ORDER BY class ASC, subclass DESC; 
+0

對於你的答案PostgreSQL給我一個錯誤,像「列」table.number「必須出現在GROUP BY子句中或用於聚合函數」 – 2013-03-21 14:02:46

+0

@Revan你是否得到與當前答案或從以前的錯誤版?因爲我不明白現在的情況會如何發生。 – 2013-03-21 15:10:26

0

如果number數字(這對我來說很有意義)實際存儲,那麼你需要處理的類型轉換。 MySQL支持substr()的數值,但不是Postgres的:

SELECT class, subclass, count(*) 
FROM (SELECT (CASE substr(numstr,1,2) WHEN '56' then 'class1' 
             WHEN '43' then 'class2' 
             else 'other' 
       END) as class, 
       (CASE substr(numstr,3,2) WHEN '72' then 'subclass1' 
             WHEN '98' then 'subclass2' 
             ELSE 'other' 
       END) as subclass 
     FROM (select t.*, cast(number as varchar(255)) as numstr 
       from table t 
      ) t 
    ) t 
WHERE class <> 'other' AND subclass <> 'other' 
GROUP BY class, subclass 
ORDER BY class ASC, subclass DESC; 

我也改了比較having子句中subclass <> 'other'。沒有名爲other的專欄,所以我認爲你的意思是價值。

+0

對於你的答案PostgreSQL給我一個錯誤,像「列」table.numstr「必須出現在GROUP BY子句中或用於聚合函數」 – 2013-03-21 14:12:21

+1

@RevanDarth。 。 。這根本沒有意義。你在其中一個子查詢上有「count(*)」嗎?它應該只出現在外部查詢中。 – 2013-03-21 14:16:30