在Oracle中分组的查询中对记录进行计数时返回错误

时间:2019-06-05 05:55:04

标签: oracle

我在尝试对一些记录进行分组并试图对查询返回的记录数进行计数时遇到了一个问题:

07  COMERCIO                               92         
15  SERVICIOS OTROS                        41  
01  AGRICULTURA, GANADERIA Y SILVICULTURA  141  
04  INDUSTRIA MANUFACTURERA                28  
10  BANCA Y FINANZAS                       5    
12  ADMINISTRACION PUBLICA                 16  
03  MINERIA                                3  
16  HOGAR                                  2  
08  HOTELES Y RESTAURANTES                 37  
11  EMPRESARIAL                            21  
14  SOCIAL Y SALUD                         4  
06  CONSTRUCCIÓN                           3  
09  TRANSPORTE                             30  
13  EDUCACION                              10

这是查询:

SELECT 
    AGRUP.VC_CODDET AS CHR_SECECO,
    AGRUP.VC_NOMDET AS VC_SECECO,
    0 AS INT_NROPRESTAMO,
    COUNT(*)  INTO_BENEFICIARIOS,
    0 AS DEC_SALCON      
    FROM TB_JSI_PRESTAMO_DETALLE PREDET
INNER JOIN TB_JSI_PRESTAMO PRE ON 
PRE.INT_IDPRESTAMO=PREDET.INT_IDPRESTAMO
INNER JOIN TB_JSI_BENEFICIARIO_IFI BENIFI ON 
BENIFI.INT_IDBENEIFI=PRE.INT_IDBENEIFI
INNER JOIN TB_JSI_OPERACION OPE ON PRE.INT_IDOPE = OPE.INT_IDOPE AND 
TRUNC(TO_DATE(OPE.DT_FECVEN))>TRUNC(TO_DATE('30/09/2018', 'DD/MM/YY'))   
INNER JOIN TB_JSI_CIIU CIIU ON PRE.INT_IDACT = CIIU.INT_IDACT AND 
PRE.INT_IDSEC=CIIU.INT_IDCLAS 
INNER JOIN TB_JSI_TABLA_DET SECECO ON SECECO.INT_IDDET=CIIU.INT_IDCLAS 
INNER JOIN TB_JSI_AGRUPA_SECTOR AGRSEC ON SECECO.INT_IDDET = 
AGRSEC.INT_IDSEC 
INNER JOIN TB_JSI_TABLA_DET AGRUP ON AGRSEC.INT_IDAGRU = AGRUP.INT_IDDET 
INNER JOIN TB_JSI_TABLA_DET MON ON OPE.INT_IDMON = MON.INT_IDDET
INNER JOIN TB_JSI_IFI IFI ON OPE.INT_IDIFI = IFI.INT_IDIFI 
WHERE TRUNC(PREDET.DTE_FECPRO) = (
            SELECT 
                    TRUNC(DTE_FECPRO)
            FROM (SELECT 
                    DTE_FECPRO
                  FROM TB_JSI_PRESTAMO_DETALLE
                  WHERE DTE_FECPRO<=TO_DATE('30/09/2018','DD/MM/YY')
                  AND DEC_SALDOL>0
                  ORDER BY DTE_FECPRO DESC)
                  WHERE ROWNUM = 1
            ) 
            AND (NULL IS NULL OR OPE.INT_IDTIPPRO =2) 
            AND (NULL IS NULL OR OPE.INT_IDMON = 364)
            AND (NULL IS NULL OR OPE.INT_IDIFI=72)
            GROUP BY AGRUP.VC_CODDET, AGRUP.VC_NOMDET

并应返回此结果

07  COMERCIO                               92  
15  SERVICIOS OTROS                        41  
01  AGRICULTURA, GANADERIA Y SILVICULTURA  141  
04  INDUSTRIA MANUFACTURERA                28  
10  BANCA Y FINANZAS                       4    
12  ADMINISTRACION PUBLICA                 16  
03  MINERIA                                3  
16  HOGAR                                  2  
08  HOTELES Y RESTAURANTES                 37  
11  EMPRESARIAL                            21  
14  SOCIAL Y SALUD                         4  
06  CONSTRUCCIÓN                           3  
09  TRANSPORTE                             30  
13  EDUCACION                              10  

因为我有这些记录,并且在计数时应该返回4而不是5

269516  10  BANCA Y FINANZAS        1   
269558  10  BANCA Y FINANZAS        1   
269592  10  BANCA Y FINANZAS        2   
269611  10  BANCA Y FINANZAS        1

1 个答案:

答案 0 :(得分:0)

@Roller,我已经分析了结果,现在很清楚查询中使用的表之一具有两个条件匹配的记录,这就是为什么它返回5而不是4的原因。

您只需要标识表,如果无法识别表,请使用以下技巧。

首先,确定表(要说该表必须有4行),然后在计数中使用该表的PK,其区别如下:

 COUNT(DISTINCT MY_PK)