2010-11-18 166 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時可以使用它。