Mientras Oracle está agrupando y sumando, consulte la suma total de las reglas de agrupación en la última columna

El proyecto de la empresa tiene un requisito, es decir, tener una tabla de fallas, el número de fallas por las cuales se debe investigar la causa de la falla del carril y el porcentaje del tipo de falla en un carril en ese carril.

En términos sencillos, suponga que una empresa tiene 10 departamentos, calcule la suma del salario mensual de cada departamento y calcule el porcentaje del salario mensual total de cada departamento en el salario de la empresa.

 

Debido a que los datos de la empresa están involucrados, los datos no se publicarán aquí. La capacidad personal es limitada y la escritura no es buena. Es solo para referencia.

Como se muestra abajo

 

Después de pensarlo durante mucho tiempo, mi capacidad personal es limitada y no lo he escrito. Finalmente, pensé en la idea de dividir y conquistar, dividir funciones complejas en funciones simples y luego combinarlas en funciones deseadas, aunque no es necesariamente la mejor solución. Pero siempre lo escribí en mi propia capacidad

 

Primero, encuentre el número de fallas en cada carril

SELECT
	'故障原因' AS "searchResult",
	f.ROAD_CODE AS "roadCode",
	s.ROAD_NAME AS "roadName",
	f.STATION_CODE AS "stationCode",
	s.STATION_NAME AS "stationName",
	f.LANE_CODE AS "laneCode",
	COUNT( f.FAULT_TYPE ) AS counts 
FROM
	TB_DS_FAULTINFO f
	LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE 
	AND f.STATION_CODE = s.STATION_CODE 
WHERE
	f.FAULT_TYPE = '1' 
GROUP BY
	f.ROAD_CODE,
	s.ROAD_NAME,
	f.STATION_CODE,
	s.STATION_NAME,
	f.LANE_CODE

resultado de búsqueda

También hay un total después de agrupar

No se preocupe, el sql anterior se filtra por las condiciones detrás de WHERE primero y luego se agrupa; por lo tanto, no importa cómo se agrupen los datos filtrados, entonces el número total de datos filtrados no cambia

Entonces, el sql total después de agrupar es:

SELECT
    COUNT( f.ID ) 
FROM
    TB_DS_FAULTINFO f
    LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE 
    AND f.STATION_CODE = s.STATION_CODE 
WHERE
    f.FAULT_TYPE = '1'

 

resultado de búsqueda

image.png

Entonces, el sql final combinado es

SELECT
	'故障原因' AS "searchResult",
	f.ROAD_CODE AS "roadCode",
	s.ROAD_NAME AS "roadName",
	f.STATION_CODE AS "stationCode",
	s.STATION_NAME AS "stationName",
	f.LANE_CODE AS "laneCode",
	COUNT( f.FAULT_TYPE ) AS counts,
	(SELECT	COUNT( f.ID ) 	FROM TB_DS_FAULTINFO f	LEFT JOIN TB_BASE_STATION s ON 
    f.ROAD_CODE = s.ROAD_CODE 	
	AND f.STATION_CODE = s.STATION_CODE 
	WHERE f.FAULT_TYPE = '1' ) AS total 
FROM
	TB_DS_FAULTINFO f
	LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE 
	AND f.STATION_CODE = s.STATION_CODE 
WHERE
	f.FAULT_TYPE = '1' 
GROUP BY
	f.ROAD_CODE,
	s.ROAD_NAME,
	f.STATION_CODE,
	s.STATION_NAME,
	f.LANE_CODE

 

Entonces, el resultado final de la consulta es:

 

Ahora que el número total de causas de falla está ahí, y la cantidad de causas de falla en cada carril está disponible, entonces calcular el porcentaje es mucho más simple, así que no lo escribiré aquí.

Procesamiento más eficiente

Utilice una función de escala dedicada

suma () sobre ()

ratio_to_report () sobre () 

SELECT
	'故障原因' AS "searchResult",
	f.ROAD_CODE AS "roadCode",
	s.ROAD_NAME AS "roadName",
	f.STATION_CODE AS "stationCode",
	s.STATION_NAME AS "stationName",
	f.LANE_CODE AS "laneCode",
	COUNT( * ) AS "counts",
	sum( COUNT( * ) ) over ( ) AS "total",
	round( ratio_to_report ( COUNT( * ) ) over ( ) * 100, 2 ) || '%' AS "proportion" 
FROM
	TB_DS_FAULTINFO f
	LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE 
	AND f.STATION_CODE = s.STATION_CODE 
WHERE
	f.FAULT_TYPE = '1' 
GROUP BY
	f.ROAD_CODE,
	s.ROAD_NAME,
	f.STATION_CODE,
	s.STATION_NAME,
	f.LANE_CODE

 

Supongo que te gusta

Origin blog.csdn.net/qq_39999478/article/details/107328639
Recomendado
Clasificación