2013-03-15 52 views
2

我使用的是CASE声明这样的表演在PostgreSQL的SQL查询两列:乘以已计算的CASE语句

SELECT 
    CASE column1 
     WHEN something THEN 10 
     ELSE 20 
     END AS newcol1 
    CASE column12 
     WHEN something THEN 30 
     ELSE 40 
     END AS newcol2 
COUNT(column3) newcol3 
FROM table 
GROUP BY newcol1,newcol2,newcol3 

我需要它必须是newcol2 * newcol3结果的第四列,我怎样才能做到这一点?

如果我把(newcol2 * newcol3) AS newcol4我得到一个语法错误。

+1

我想你忘记了你的列之间的逗号。这是一个错字吗? – didierc 2013-03-15 16:45:43

+0

Ups,我在这里做的,但不是在我原来的查询中,当我把(newcol2 * newcol3)作为newcol4行时出现语法错误。 – xiidarkevil 2013-03-15 16:48:29

回答

4

您可以随时使用CTE抽象东西拿走,以不同的级别,如果这能帮助 - 沿着线的东西...

With CTE as 
(
SELECT 
    CASE column1 
    WHEN something THEN 10 
    ELSE 20 
    END AS newcol1, 
    CASE column12 
    WHEN something THEN 30 
    ELSE 40 
    END AS newcol2, 
    column3, 
FROM table 
) 
SELECT 
    newcol1, newcol2, 
    count(column3) as newcol3, 
(newcol2 * newcol3) AS newcol4 
FROM CTE 
GROUP BY newcol1,newcol2,newcol3 
+0

这里也会有语法错误。你不能'GROUP BY newcol3'(在'SELECT'列表生成的列)。 – 2013-03-15 17:02:10

+0

是的,可能是:)这就是为什么我说“沿着某些东西”的原因 - 只是为了给他一个总体想法。它没有经过测试或任何东西。 – 2013-03-15 17:08:40

+0

谢谢你,我的好先生! – xiidarkevil 2013-03-15 17:14:21

2

的CTE是一种有效的方法,让更多的选项。
对于像这样的简单情况,简单的子查询更简单,速度稍快。

SELECT *, (newcol2 * newcol3) AS newcol4 
FROM (
    SELECT CASE column1 
      WHEN something THEN 10 
      ELSE 20 
      END AS newcol1 
     ,CASE column12 
      WHEN something THEN 30 
      ELSE 40 
      END AS newcol2 
     ,COUNT(column3) AS newcol3 
    FROM table 
    GROUP BY 1, 2 
    ) AS sub 

BTW:我取出newcol3GROUP BY,因为你是在其上运行的聚合函数count(),这是稍微荒谬的。