2013-03-21 94 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