如何使用case语句和min()与group by?

问题描述 投票:1回答:2

当我执行下面的查询时

SELECT CASE
         WHEN spd.IS_MAIN_DEFECT='Y' 
           THEN spd.piece_Defect_num_id 
         ELSE min(spd.PIECE_DEFECT_NUM_ID)
       END AS defect
  FROM piece P,
       STY_PIECE_DEFECT spd,
       STY_DEFECT_CATALOGUE sdc,
       piece_history ph,
       piece_history_out pho,
       PLANT_CONFIG pc
  (...inner join and where clause)
  GROUP BY p.PIECE_ID,
           CASE
             WHEN spd.IS_MAIN_DEFECT='Y'
               THEN spd.piece_Defect_num_id
             ELSE min(spd.PIECE_DEFECT_NUM_ID)
           end 

似乎错误

ORA-00934:此处不允许使用组功能。

我想,在group by中出现了min()错误。

如何解决这个问题?

sql oracle
2个回答
1
投票

你必须使用 analytical MIN() 如下图所示 without group by

     SELECT distinct CASE WHEN spd.IS_MAIN_DEFECT='Y' 
      THEN spd.piece_Defect_num_id 
       ELSE min(spd.PIECE_DEFECT_NUM_ID) over () END AS defect
      FROM piece P , STY_PIECE_DEFECT spd ,STY_DEFECT_CATALOGUE sdc ,piece_history ph 
      , piece_history_out pho, PLANT_CONFIG pc
      (...inner join and where clause)

0
投票

我明白你是想保存 PIECE_DEFECT_NUM_ID 成排 IS_MAIN_DEFECT = 'Y' 而得到 MIN 的值 非主要 缺陷线。

最简单的解决方法是,在只有 每行 PIECE_IDIS_MAIN_DEFECT = 'Y' - 贵集团 PIECE_ID, IS_MAIN_DEFECT并计算出 min(PIECE_DEFECT_NUM_ID)

没事儿 MIN 一行组的值等于原值。

select PIECE_ID,IS_MAIN_DEFECT,
min(PIECE_DEFECT_NUM_ID) PIECE_DEFECT_NUM_ID
from tab
group by PIECE_ID, IS_MAIN_DEFECT
order by 1,2 desc;

万一你能有 多行 (相同的PIECE_ID)与主标志,简单的选择他们不分组,然后将分组后的 非主要 部分使用 UNION ALL

select PIECE_ID,IS_MAIN_DEFECT,PIECE_DEFECT_NUM_ID
from tab
where IS_MAIN_DEFECT = 'Y'
UNION ALL
select PIECE_ID,IS_MAIN_DEFECT,
min(PIECE_DEFECT_NUM_ID) PIECE_DEFECT_NUM_ID
from tab
where nvl(IS_MAIN_DEFECT,'N') != 'Y'
group by PIECE_ID, IS_MAIN_DEFECT
© www.soinside.com 2019 - 2024. All rights reserved.