Oracle11g 返回组(最小/最大)结果的oracle案例语句

Oracle11g 返回组(最小/最大)结果的oracle案例语句,oracle11g,group-by,case,Oracle11g,Group By,Case,我正在创建一个case语句,根据具体情况返回一个min或max日期字段 由于案例中有group函数,我想我需要将部分或全部语句放在group by section中,但我得到一个错误ORA-00934:当我尝试将group函数放在group by section中时,这里不允许使用group函数 我还试图根据同一个case语句连接到另一个表,但这似乎也不起作用 以下是违规案例陈述: 案例 当id.DISC\u PGM\u NUM在'15B'、'20B'、'25B'、'24B'、'28B'、'33

我正在创建一个case语句,根据具体情况返回一个min或max日期字段

由于案例中有group函数,我想我需要将部分或全部语句放在group by section中,但我得到一个错误ORA-00934:当我尝试将group函数放在group by section中时,这里不允许使用group函数

我还试图根据同一个case语句连接到另一个表,但这似乎也不起作用

以下是违规案例陈述:

案例 当id.DISC\u PGM\u NUM在'15B'、'20B'、'25B'、'24B'、'28B'、'33B'中时,则为maxcn.CN\u日期 否则mincn.CN\u日期以Open\u dt结尾

以下是完整的查询:

SELECT DISTINCT
        id.CUST_ID,  
        case
          when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then 'Flex Bundle'
            when id.UDAC_CODE = 'ELB1' then 'ELB1'
            when id.UDAC_CODE = 'ELB2' then 'ELB2'
            when id.UDAC_CODE in ('GAT2', 'GAT1W','START', 'STARTW') then 'Smart Start Bundle'
                  else 'Unknown'
            end as ProgramName,         
        case
             when CN.SIGN_TYPE = 'U' then ' 920'
            else id.DIV_NUM end as Div,
        case
            when CN.SIGN_TYPE = 'U' then '0920'
            else id.UNIT_NUM end as Unit,        
        case 
            when CN.SIGN_TYPE = 'U' then 9200
            else id.SALES_REP_ID end as Rep_ID,
        case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end as  Open_dt,            
         extract(year from case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end) as Yr,      
        To_Number(to_char(case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end,'IW'), '99') as  Wk, 
        sum(id.ITEM_NISD_AMT) as BundleNI   

    from 
        ICV.VZ_ITEM_DETAIL                            id
        join ICV.VZ_CUSTOMER                   vc  on (vc.CUSTOMER_ID = id.CUST_ID)
        left outer join (
            select  CUSTOMER_ID, PRODUCT_CODE, PRODUCT_ISSUE_NUM, min(CONTRACT_DATE) as CN_date, SIGN_TYPE
            from    VAST.CONTRACT                      
            where 
            SIGN_TYPE not in ( 'U', 'M', '-', 'C', 'L')
            group by   CUSTOMER_ID, PRODUCT_CODE, PRODUCT_ISSUE_NUM,  sign_type) cn
        on (ID.CUST_ID = CN.CUSTOMER_ID and ID.DIR_NUM = CN.PRODUCT_CODE 
                                                                        and id.DIR_ISSUE_NUM = cn.PRODUCT_ISSUE_NUM)
           where 
        (id.UDAC_CODE in ('ELB1', 'ELB2', 'GAT2', 'GAT1W','START', 'STARTW')
        or id.DISC_PGM_NUM in ('15B','20B','25B','24B','28B','33B'))
        and id.DIV_NUM in ('  C2', '  C3', '  C4', '  C6', '  N1', '  N2', ' 371', '  K3', '  K1', '  K2' , ' 275', ' 253', ' 368', ' 296')
        and id.ITEM_ACTION_CODE in ('A', 'I')
           and id.PAY_PERIOD_YR= '2015'
        and vc.SOURCE_SYSTEM_CDE= 'V'
        and id.HANDLED_PAY_PERIOD_YR is not null
        and HANDLED_PAY_PERIOD_NUM >=6

    group by
        id.CUST_ID,   
        case
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then 'Flex Bundle'
            when id.UDAC_CODE = 'ELB1' then 'ELB1'
            when id.UDAC_CODE = 'ELB2' then 'ELB2'
            when id.UDAC_CODE in ('GAT2', 'GAT1W','START', 'STARTW') then 'Smart Start Bundle'
            else 'Unknown'
            end,         
        case
             when CN.SIGN_TYPE = 'U' then ' 920'
            else id.DIV_NUM end,
        case
            when CN.SIGN_TYPE = 'U' then '0920'
            else id.UNIT_NUM end,        
        case 
            when CN.SIGN_TYPE = 'U' then 9200
            else id.SALES_REP_ID end,    
            case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end,            
         extract(year from case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end),      
        To_Number(to_char(case 
            when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
            else min(cn.CN_DATE) end,'IW'), '99')  

这是可能的吗?

在案例的THEN部分,您可以使用单行子查询执行您想要的操作。 例如


希望您能找到解决方案。

如果没有要测试的模式,很难完全写出您的大型查询。但这样的事情是行不通的:

when id.DISC_PGM_NUM in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
它不起作用,因为未对DISC_PGM_NUM进行分组

现在,如果您聚合DISC_PGM_NUM,它就可以工作了。像这样:

when max(id.DISC_PGM_NUM) in  ('15B','20B','25B','24B','28B','33B') then max(cn.CN_DATE)
问题是maxid.DISC\u PGM\u NUM不会提供您想要的值。如果记录的值为'15B'和'40B','40B'将是您的最大值,因此它不适合IN子句。解决这个问题的一种方法是使用DECODE或其他CASE语句

例如:

when max(case when id.DISC_PGM_NUM in ('15B','20B','25B','24B','28B','33B') then 1 else 0 end) = 1 then max(cn.CN_DATE)

将考虑所有你想要的值为1,其他值为0,以便你的MAX正确评估。


查看此SQLFIDLE:

您可以将它们包含在案例陈述中,并且它们不会出现在您的小组中。如果您希望得到一个好的答案,请显示完整的SQL和表结构。谢谢Manish-我将按节分组放置什么?@MarkJustice-您希望按节分组放置在哪里?您不能将子查询部分放在THEN部分,因为我已经提到它应该是一个单行子查询。我可能需要将整个查询括起来,以便理解。表别名是CN,我放在where子句中,带有以下左外部联接选择CUSTOMER\U ID、PRODUCT\U CODE、PRODUCT\U ISSUE\U NUM、minCONTRACT\U DATE作为CN\U DATE、来自VAST.CONTRACT的SIGN\U TYPE,其中SIGN\U TYPE不在'U'、'-'、'C'、'L'组中,按CUSTOMER\U ID,产品代码、产品发布编号、签名类型cn on ID.CUST\u ID=cn.CUSTOMER\u ID和ID.DIR\u NUM=cn.PRODUCT\u代码和ID.DIR\u ISSUE\u NUM=cn.PRODUCT\u ISSUE\u nums案例陈述会是这样的吗?如果在'15B'、'20B'、'25B'、'24B'、'28B'、'33B'中的id.DISC_PGM_NUM从cn中选择MaxCN_日期,或者从cn中选择minCN_日期作为Open_dt,@MarkJustice-是否可以在此处显示完整的sql?我可能需要看到它的全部来理解它。。。
when max(case when id.DISC_PGM_NUM in ('15B','20B','25B','24B','28B','33B') then 1 else 0 end) = 1 then max(cn.CN_DATE)