公司项目有一个需求,就是有一张故障表,要查询车道故障原因的的故障数,以及一个车道,在该车道的该故障类型的百分比,
说通俗点,假设 一个公司有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。