SQL查询,如何在GROUP BY中选择生成的字段

时间:2014-05-06 08:52:29

标签: sql oracle10g

我正在尝试选择customer_id和segment(基于某些逻辑)两件事,这两件事要求它们都在GROUP BY中

我尝试使用没有别名(比如给CASE ... END),但是因为GROUP BY字段名中有MAX而失败了。如果我砍掉MAX,那么它也无法编译。

我应该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:0)

我不确定为什么你在申请不同时需要“分组依据”条款。我坚信从您的查询中删除“分组依据”条款将为您提供您期望的结果。

答案 1 :(得分:0)

我相信这对我来说是一个SQL小提琴:

alter session enable parallel query;

SELECT
  t1.CUSTOMER_ID AS CUSTOMER_ID,
  MAX(CASE WHEN t2.event_date=t1.event_date  -- MAX is moved all the way outside
           THEN 'SweepAcquired' 
           ELSE 'NonSweepAcquired'
           END) AS SEGMENT
FROM dsi t1, transaction t2
WHERE t1.CUSTOMER_ID=t2.CUSTOMER_ID(+)
AND t1.MARKETPLACE_ID = '1'
AND lower(t2.event_type(+))='like'
AND lower(t2.SOURCE_TYPE(+))='sweepstakes'
AND t2.SOURCE_ID(+) IS NOT NULL
AND lower(t2.SOURCE_ID(+)) <> 'unknown'
AND t2.ENTITY_ID(+)='1'
GROUP BY t1.CUSTOMER_ID, 
         CASE WHEN t2.event_date = t1.event_date
              THEN 1 
              ELSE 0 
              END
ORDER BY t1.CUSTOMER_ID, SEGMENT
;

出于某种原因,CASE WHEN MAX() CASE WHEN对我不起作用。我还根据WHERE子句中的重复简化了一些事情。

在这里工作小提琴http://sqlfiddle.com/#!4/630d7/46