SQL - 具有Group By功能的CASE语句

时间:2010-11-18 15:23:50

标签: sql

我写了这个查询并尝试按“D”分组,但它不起作用。任何帮助?

(select hr_id, max(delivery_dt)as maxd,
  (CASE 
    WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
    WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
    WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
    ELSE '> 133 MO' END) D
from INDIVIDUAL_VE_TB 
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
Group by hr_id)

我得到了这个结果

HR                DATE               D
2000001076        4/22/1994         > 133 MO
2000004986        12/13/2004        7 - 78 MO
2000003382        12/13/2003        7 - 78 MO

这是HR的分组,我也试图按D分组,但它不起作用 我把D添加到了小组中 按hr_id分组,D

任何帮助都会很棒!!!

提前谢谢

5 个答案:

答案 0 :(得分:3)

你可以尝试:

Select hr_id, max(maxd), D
from
    (select hr_id, max(delivery_dt)as maxd,
      (CASE 
        WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
        WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
        WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
        ELSE '> 133 MO' END) D
    from INDIVIDUAL_VE_TB 
    where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
    Group by hr_id)
group by D, hr_id

答案 1 :(得分:1)

处理SQL语句的顺序是关键:

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • UNION
  • EXCEPT
  • INTERSECT
  • ORDER BY

请注意,在GROUP BY之前处理SELECT。因此,您无法使用SELECT原因中的别名 - 此时SQL引擎将不会知道它。这也是为什么建议将其移动到FROM子句中的子选择的其他答案是正确的。如果在FROM中完成,则在您到达GROUP BY时就可以使用。

答案 2 :(得分:0)

您必须在组中重复整个案例陈述。你不能使用别名。

如果您使用的是SQL Server,则可以使用WITH子句创建临时命名结果集,并按此组进行分组。

如果没有,您也可以创建一个视图,而不需要按相关列对该视图进行分组和分组。

版本1(复制并粘贴计算列):

select 
    hr_id, 
    max(delivery_dt)as maxd,
    (CASE 
        WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
        WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
        WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
        ELSE '> 133 MO'
    END) D
from 
    INDIVIDUAL_VE_TB 
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
group by 
    hr_id,
    (CASE 
        WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
        WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
        WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
        ELSE '> 133 MO' 
    END)

版本2(WITH子句):

with temporary(hr_id, maxd, D)
{
    select 
        hr_id, 
        max(delivery_dt)as maxd,
        (CASE 
            WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
            WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
            WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
            ELSE '> 133 MO'
        END) D
    from 
        INDIVIDUAL_VE_TB 
    where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
    group by 
        hr_id
}
select 
    hr_id,
    MAX(maxd) maxd,
    D
from 
    temporary
group by
    hr_id, D

版本3只是版本2的两部分。

答案 3 :(得分:0)

将其移至连接,以便您拥有可分组的表达式。

select hr_id, max(delivery_dt)as maxd, i.D
from 
  INDIVIDUAL_VE_TB IV1
  join (
    select
      CASE 
        IV2._YOUR_PK_HERE_ PK
        WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO'
        WHEN max(delivery_dt) > '11-may-2004' and  max(delivery_dt) < '11-may-2010'   then '7 - 78 MO'
        WHEN max(delivery_dt) > '11-nov-1999' and  max(delivery_dt) < '11-april-2004' then '79 - 132 MO'
        ELSE '> 133 MO' as D
      END
    from
      INVDIVIDUAL_VE_TB IV2
  ) i on i.PK=IV1.PK

where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200')
Group by hr_id, I.D

答案 4 :(得分:0)

avgsummaxcount group by子句中不允许使用函数,无论其中包含哪些其他函数(在此案例CASE)。

GROUP BY CASE之后的WHEN条件中尝试列出您delivery_dt中使用的字段,在这种情况下为{{1}}。