2010-11-18 167 views
1

我写了这个查询并试图按“D”分组,但它不起作用。任何帮助?带分组功能的SQL - CASE语句

(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 

这是由人力资源分组,我也想组由d,但它不工作 我加d到组由 集团通过hr_id, D

任何帮助将是伟大的!

预先感谢您

+0

你不是按'D'分组的:'hr_id' Group – AndreKR 2010-11-18 15:27:10

+0

你使用的是什么RDBMS? – 2010-11-18 15:53:25

回答

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 
+0

仍然无法正常工作。我收到一个错误,说不是按表达式分组。 – 2010-11-18 15:39:52

+1

您还必须按hr_id进行分组。 – VVS 2010-11-18 15:49:30

+0

@VVS:是的,我认为你是对的。更新。 – FrustratedWithFormsDesigner 2010-11-18 16:26:26

0

你必须重复整个case语句在一组。你不能使用别名。

如果您使用的是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两个部分。

+0

我试过这样做,但它没有工作 – 2010-11-18 15:41:21

+0

现在它说组功能不允许在这里。我用THX的方式使用PL/SQL! – 2010-11-18 15:59:16

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 
0

avgsummaxcount函数不是group by子句中允许的,不管他们是在什么之内的其他功能(在这种情况下CASE)。

尝试列出字段在GROUP BY您正在使用CASE条件后WHEN,在这种情况下 - delivery_dt

0

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

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

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