公司项目有一个需求,就是有一张故障表,要查询车道故障原因的的故障数,以及一个车道,在该车道的该故障类型的百分比,

说通俗点,假设 一个公司有10个部门,求每个部门每个月发工资的总和,同时计算每个部门每个月发工资的总和占全公司所发工资的百分比

因为涉及公司数据,这里就不把数据贴出来了,个人能力有限,写的不好,仅提供参考

如下图所示

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

首先,先求出每个车道的故障数

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

那还有一个分组后的总数

先别急,上面的sql,先通过 WHERE 后面的条件进行过滤,然后进行分组;所以,无论对过滤后的数据怎么分组,那么,过滤后的数据的总数是不变的

那么,分组后的总数sql是:

SELECT
    COUNT( f.ID ) 
    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'

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

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

所以最终的查询结果是:

现在故障的原因总数是有了,每个车道的故障原因的数量有了,那计算百分比就简单多了,这里就不写了

更高效的处理方式

使用专用的比例函数

sum() over ( )

ratio_to_report () over ( )

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" 
	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
公司项目有一个需求,就是有一张故障表,要查询车道故障原因的的故障数,以及一个车道,在该车道的该故障类型的百分比,说通俗点,假设一个公司有10个部门,求每个部门每个月发工资的总和,同时计算每个部门每个月发工资的综合占全公司所发工资的百分比因为涉及公司数据,这里就不把数据贴出来了,个人能力有限,写的不好,仅提供参考如下图所示想了很久,个人能力有限,也没有有写出来,最后想到了分而治之的思想,把复杂的功能拆分成简单的功能,然后在组合成想要的功能,虽然不一定是最优的方案,但总归是靠自...
oracle 中实现对某一 分组 ,并显示多 的写法 1.场景: 之前一直用的mysql,在处理 分组 问题,就非常的方便,直接使用group by就搞定了,但用 oracle ,直接使用group by只能实现显示的所有 都参与的 分组 ,并且显示的 必须和group by后边的 对应,否则sql报错,如下图。 2.分析: 通过网上查找资料,发现mysql, oracle 数据库的 分组 函数group by是不一样的,这个坑很大,被坑惨了,在mysql中,只需要将要 分组 写到group by后边,就可以 查询 分好组后的全部
资产管理中的供需平衡监控。现在又如下“供需分析统计结果”表 [img]http://dl.iteye.com/upload/attachment/593716/0e48bc8e-8c58-3660-926c-52a9399001fd.jpg[/img] 现在需要求每个充电站的最新分析结果。 [code="sql"] WITH SUPPLY_TEMP AS (S...
( CASE WHEN cant_name IS NULL THEN ' 合计 ' ELSE cant_name END ) cant_name, CANT_CODE, sum(num) num, ````````````````````````````` group by GROUPING SETS ( (cant_name, cant_code ), ( ) ) List item
比如select gid from table group by gid 查询 时使用下面的方法 查询 条数select count(distinct gid) from table使用select count(gid) from table group by gid是错误的这样 查询 的是 分组 后 每个组内部的条数转载于:https://www.cnblogs.com/rchao/p/4562836.html## 具有原始数据信息如下: 想得到如下汇 信息(统计每个产品所有数据日期 TRANS_DATE、所有客户来源 CUSTOMER_SOURCE 下的金额 AMT、份额 SHARES 值): grouping(columnA)函数的意思:当前行如果是由rollup汇 产生的,那么columnA这个字段值为1否则为0 SELECT t.PRD_CODE, t.TRANS_DATE, -- 如果当前行是由 TRANS_DATE 和 CUSTOMER_SOURCE 汇 产生的,则将CUST
Oracle 中,可以使用 `row_number()` 函数来实现 分组 取第一条记录的功能。例如,假设有一张表 `mytable`,其中有两 `col1` 和 `col2`,并且想要按照 `col1` 分组 ,并取出每组的第一条记录。你可以这样写 查询 语句: SELECT col1, col2 FROM ( SELECT col1, col2, row_number() over (partition by col1 order by col2) as row_num FROM mytable WHERE row_num = 1; 上面的 查询 中,首先使用 `row_number()` 函数根据 `col1` 分组 ,并按照 `col2` 的值排序。然后使用子 查询 将结果集编号为 `row_num`。 最后 ,在外层 查询 中取出 `row_num` 为 1 的记录即可。 请注意,这个 查询 只能取出每组的第一条记录,如果想要取出其他记录,可以将子 查询 中的 `row_num` 改为其他数字即可。例如,如果想要取出每组的第二条记录,可以将 `row_num` 改为 2。