Oracle - Problemas con group by

 
Vista:
sin imagen de perfil

Problemas con group by

Publicado por speedfroggy (7 intervenciones) el 19/01/2017 10:13:03
Muy buenas.
Tengo esta select y me da error en la group by

SELECT F.COD_PROV,
COUNT (F.RECETA) N_RECETAS,
100 * SUM(DECODE(M.GRUPO_ATC,'C10AA01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0))
/
SUM(DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10BX03')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10AX09')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10BA02')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))))) SIMVAS,
100 * SUM(DECODE(M.GRUPO_ATC,'M01AB05',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
'M01AE01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
'M01AE02',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))
/
SUM(DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AC')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AE')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AG')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AH')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX01')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX02')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX17')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD))))))))))) AINE,
100 * SUM(DECODE(M.GRUPO_ATC,'A02BC01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0))
/
SUM(DECODE(SIGN(INSTR(M.GRUPO_ATC,'A02BC')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0)) OME,
100 * SUM(DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))))
/
SUM(DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09CA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09DA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09DB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09XA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD))))))))) IECA
FROM COLECTIVO.FARMACIA F,
COLECTIVO.MEDICAMENTO_PART M,
COLEGIADO_ADE_AUX1 C
WHERE F.COD_MEDICAMENTO = M.COD_MEDICAMENTO
AND M.FECHA_NOMEN = TO_DATE('01/07/2016','DD/MM/YYYY')
AND ((M.GRUPO_ATC LIKE 'C10AA%' OR M.GRUPO_ATC IN ('C10BX03','C10AX09','C10BA02'))
OR (M.GRUPO_ATC IN ('M01AB05','M01AE01','M01AE02') OR M.GRUPO_ATC LIKE 'M01AA%' OR M.GRUPO_ATC LIKE 'M01AB%' OR M.GRUPO_ATC LIKE 'M01AC%' OR M.GRUPO_ATC LIKE 'M01AE%'OR M.GRUPO_ATC LIKE 'M01AG%' OR M.GRUPO_ATC LIKE 'M01AH%' OR M.GRUPO_ATC IN ('M01AX01', 'M01AX02', 'M01AX17'))
OR (M.GRUPO_ATC = 'A02BC01' OR M.GRUPO_ATC LIKE 'A02BC%')
OR (M.GRUPO_ATC LIKE 'C09AA%' OR M.GRUPO_ATC LIKE 'C09BA%' OR M.GRUPO_ATC LIKE 'C09BB%' OR M.GRUPO_ATC LIKE ('C09AA%') OR M.GRUPO_ATC LIKE ('C09BA%') OR M.GRUPO_ATC LIKE ('C09BB%')
OR M.GRUPO_ATC LIKE ('C09CA%') OR M.GRUPO_ATC LIKE ('C09DA%') OR M.GRUPO_ATC LIKE ('C09DB%') OR M.GRUPO_ATC LIKE ('C09XA%')))
AND M.DDD IS NOT NULL
AND M.DDD > 0
AND F.FECHA = TO_DATE('01/07/2016','DD/MM/YYYY')
AND F.MOD_ASIST = 'A1'
AND F.COD_COLEGIADO = C.COD_DELEGA||SUBSTR(C.N_COLEGIADO,5,5)
GROUP BY F.COD_PROV,F.RECETA,M.GRUPO_ATC,ENVASES,CONTENIDO,DOSISNUM,DDD

El caso es que si quito la primera columna funciona sin problemas.

¿Alguna idea?
Gracias
Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Problemas con group by

Publicado por speedfroggy (7 intervenciones) el 19/01/2017 14:04:48
Mi buenas.
Por si a alguien le sirve he encontrado la solución.
La select la he cambiado un poco pero más o menos es igual.
El tema es que al anidar los SUM no deja luego usar una columna que no sea agregada. Así que se saca de la agregación.
El SUM se hace en una select por encima

SELECT C.COD_DELEGA COD_DELEGA,
C.DELEGACION DELEGACION,
C.N_COLEGIADO N_COLEGIADO,
SUBSTR((INITCAP(RTRIM(LTRIM(C.PROVEED1)))||' '||INITCAP(RTRIM(LTRIM(C.PROVEED2)))||', '||INITCAP(RTRIM(LTRIM(C.PROVEED3)))),1,50) NOMBRE,
N.N_RECETAS,
DECODE(SUM(SIMVAS_DEN),NULL,NULL,0,NULL,100 * SUM(SIMVAS_NUM)/SUM(SIMVAS_DEN)) SIMVAS, -- Esto es lo que se saca del anidado de SUM
DECODE(SUM(AINE_DEN),NULL,NULL,0,NULL,100 * SUM(AINE_NUM)/SUM(AINE_DEN)) AINE, -- Esto es lo que se saca del anidado de SUM
DECODE(SUM(OME_DEN),NULL,NULL,0,NULL,100 * SUM(OME_NUM)/SUM(OME_DEN)) OME, -- Esto es lo que se saca del anidado de SUM
DECODE(SUM(IECA_DEN),NULL,NULL,0,NULL,100 * SUM(IECA_NUM)/SUM(IECA_DEN)) IECA -- Esto es lo que se saca del anidado de SUM
FROM COLEGIADO_ADE_AUX1 C,
(SELECT COD_COLEGIADO,
COUNT(RECETA) N_RECETAS
FROM COLECTIVO.FARMACIA
WHERE FECHA BETWEEN TO_DATE('01/05/2016','DD/MM/YYYY') AND TO_DATE('01/07/2016','DD/MM/YYYY')
AND MOD_ASIST = 'A5'
GROUP BY COD_COLEGIADO) N,
(SELECT F.COD_COLEGIADO,
DECODE(M.GRUPO_ATC,'C10AA01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0) SIMVAS_NUM,
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10BX03')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10AX09')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C10BA02')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD))))) SIMVAS_DEN,
DECODE(M.GRUPO_ATC,'M01AB05',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
'M01AE01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
'M01AE02',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)) AINE_NUM,
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AC')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AE')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AG')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AH')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX01')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX02')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'M01AX17')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))))))))) AINE_DEN,
DECODE(M.GRUPO_ATC,'A02BC01',SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0) OME_NUM,
DECODE(SIGN(INSTR(M.GRUPO_ATC,'A02BC')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),0) OME_DEN,
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))) IECA_NUM,
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09AA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09BB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09CA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09DA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09DB')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD),
DECODE(SIGN(INSTR(M.GRUPO_ATC,'C09XA')),1,SUM(ENVASES * CONTENIDO * NVL(DOSISNUM,1) / DDD)))))))) IECA_DEN
FROM COLECTIVO.FARMACIA F,
COLECTIVO.MEDICAMENTO_PART M
WHERE F.COD_MEDICAMENTO = M.COD_MEDICAMENTO
AND M.FECHA_NOMEN BETWEEN TO_DATE('01/05/2016','DD/MM/YYYY') AND TO_DATE('01/07/2016','DD/MM/YYYY')
AND ((M.GRUPO_ATC LIKE 'C10AA%' OR M.GRUPO_ATC IN ('C10BX03','C10AX09','C10BA02'))
OR (M.GRUPO_ATC IN ('M01AB05','M01AE01','M01AE02') OR M.GRUPO_ATC LIKE 'M01AA%' OR M.GRUPO_ATC LIKE 'M01AB%' OR M.GRUPO_ATC LIKE 'M01AC%' OR M.GRUPO_ATC LIKE 'M01AE%'OR M.GRUPO_ATC LIKE 'M01AG%' OR M.GRUPO_ATC LIKE 'M01AH%' OR M.GRUPO_ATC IN ('M01AX01', 'M01AX02', 'M01AX17'))
OR (M.GRUPO_ATC = 'A02BC01' OR M.GRUPO_ATC LIKE 'A02BC%')
OR (M.GRUPO_ATC LIKE 'C09AA%' OR M.GRUPO_ATC LIKE 'C09BA%' OR M.GRUPO_ATC LIKE 'C09BB%' OR M.GRUPO_ATC LIKE ('C09AA%') OR M.GRUPO_ATC LIKE ('C09BA%') OR M.GRUPO_ATC LIKE ('C09BB%')
OR M.GRUPO_ATC LIKE ('C09CA%') OR M.GRUPO_ATC LIKE ('C09DA%') OR M.GRUPO_ATC LIKE ('C09DB%') OR M.GRUPO_ATC LIKE ('C09XA%')))
AND NVL(M.DDD,0) <> 0
AND F.FECHA BETWEEN TO_DATE('01/05/2016','DD/MM/YYYY') AND TO_DATE('01/07/2016','DD/MM/YYYY')
AND F.MOD_ASIST = 'A5'
GROUP BY F.COD_COLEGIADO,F.COD_PROV,M.GRUPO_ATC,ENVASES,CONTENIDO,DOSISNUM,DDD) D
WHERE D.COD_COLEGIADO = C.COD_DELEGA||SUBSTR(C.N_COLEGIADO,5,5)
AND D.COD_COLEGIADO = N.COD_COLEGIADO
GROUP BY C.COD_DELEGA,
C.DELEGACION,
C.N_COLEGIADO,
N.N_RECETAS,
SUBSTR((INITCAP(RTRIM(LTRIM(C.PROVEED1)))||' '||INITCAP(RTRIM(LTRIM(C.PROVEED2)))||', '||INITCAP(RTRIM(LTRIM(C.PROVEED3)))),1,50)
HAVING N.N_RECETAS >= 150
ORDER BY C.COD_DELEGA, C.N_COLEGIADO

Gracias
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar