我现在有个需求就是,分组的同时,在每一列的后面,加一列该分组规则的总数量

想了很久,跟人能力有限,也没有有写出来,最后想到了分而治之的思想,把负责的功能拆分成简单的功能,然后在组合成想要的功能,虽然不一定时最优的方案,但总归是靠自己的能力写出来的

方式一:

下面的sql, 根据
f.ROAD_CODE,
s.ROAD_NAME,
f.STATION_CODE,
s.STATION_NAME,
f.LANE_CODE
这几个字段进行分组

  1. SELECT
  2. '故障原因' AS "searchResult",
  3. f.ROAD_CODE AS "roadCode",
  4. s.ROAD_NAME AS "roadName",
  5. f.STATION_CODE AS "stationCode",
  6. s.STATION_NAME AS "stationName",
  7. f.LANE_CODE AS "laneCode",
  8. COUNT( f.FAULT_TYPE ) AS counts
  9. FROM
  10. TB_DS_FAULTINFO f
  11. LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  12. AND f.STATION_CODE = s.STATION_CODE
  13. WHERE
  14. f.FAULT_TYPE = '1'
  15. GROUP BY
  16. f.ROAD_CODE,
  17. s.ROAD_NAME,
  18. f.STATION_CODE,
  19. s.STATION_NAME,
  20. f.LANE_CODE

查询结果
image.png
那还有一个分组后的总数
先别急,上面的sql,先通过 WHERE 后面的条件进行过滤,然后进行分组;所以,无论对过滤后的数据怎么分组,那么,过滤后的数据的总数是不变的

那么,总数的sql是:

  1. SELECT
  2. COUNT( f.ID )
  3. FROM
  4. TB_DS_FAULTINFO f
  5. LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  6. AND f.STATION_CODE = s.STATION_CODE
  7. WHERE
  8. f.FAULT_TYPE = '1'

查询结果
image.png

所以,组合起来最终的sql是

  1. SELECT
  2. '故障原因' AS "searchResult",
  3. f.ROAD_CODE AS "roadCode",
  4. s.ROAD_NAME AS "roadName",
  5. f.STATION_CODE AS "stationCode",
  6. s.STATION_NAME AS "stationName",
  7. f.LANE_CODE AS "laneCode",
  8. COUNT( f.FAULT_TYPE ) AS counts,
  9. (SELECT COUNT( f.ID ) FROM TB_DS_FAULTINFO f LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  10. AND f.STATION_CODE = s.STATION_CODE
  11. WHERE
  12. f.FAULT_TYPE = '1'
  13. ) AS total
  14. FROM
  15. TB_DS_FAULTINFO f
  16. LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  17. AND f.STATION_CODE = s.STATION_CODE
  18. WHERE
  19. f.FAULT_TYPE = '1'
  20. GROUP BY
  21. f.ROAD_CODE,
  22. s.ROAD_NAME,
  23. f.STATION_CODE,
  24. s.STATION_NAME,
  25. f.LANE_CODE

所以最终的查询结果是:
image.png

方式2:使用专用的比例函数

  1. SELECT
  2. t.*,
  3. sum(t."counts") over() as 总合计,
  4. round( ratio_to_report ( t."counts" ) over ( ) * 100, 2 ) || '%' AS 占比
  5. FROM
  6. (
  7. SELECT
  8. '故障原因' AS "searchResult",
  9. f.ROAD_CODE AS "roadCode",
  10. s.ROAD_NAME AS "roadName",
  11. f.STATION_CODE AS "stationCode",
  12. s.STATION_NAME AS "stationName",
  13. f.LANE_CODE AS "laneCode",
  14. COUNT( f.FAULT_TYPE ) AS "counts"
  15. FROM
  16. TB_DS_FAULTINFO f
  17. LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  18. AND f.STATION_CODE = s.STATION_CODE
  19. WHERE
  20. f.FAULT_TYPE = '1'
  21. GROUP BY
  22. f.ROAD_CODE,
  23. s.ROAD_NAME,
  24. f.STATION_CODE,
  25. s.STATION_NAME,
  26. f.LANE_CODE
  27. ) t
  1. SELECT
  2. '故障原因' AS "searchResult",
  3. f.ROAD_CODE AS "roadCode",
  4. s.ROAD_NAME AS "roadName",
  5. f.STATION_CODE AS "stationCode",
  6. s.STATION_NAME AS "stationName",
  7. f.LANE_CODE AS "laneCode",
  8. COUNT( * ) AS "counts",
  9. sum( COUNT( * ) ) over ( ) AS "total",
  10. round( ratio_to_report ( COUNT( * ) ) over ( ) * 100, 2 ) || '%' AS "proportion"
  11. FROM
  12. TB_DS_FAULTINFO f
  13. LEFT JOIN TB_BASE_STATION s ON f.ROAD_CODE = s.ROAD_CODE
  14. AND f.STATION_CODE = s.STATION_CODE
  15. WHERE
  16. f.FAULT_TYPE = '1'
  17. GROUP BY
  18. f.ROAD_CODE,
  19. s.ROAD_NAME,
  20. f.STATION_CODE,
  21. s.STATION_NAME,
  22. f.LANE_CODE