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
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