员工信息表,包括字段有:员工姓名、省份、城市、年龄、薪水
CREATE TABLE TMP_Person (PName VARCHAR2(20),PProvince VARCHAR2(20),Pcity VARCHAR2(20),PAge INT,PSalary INT)
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('A','GuangDong','ShenZhen',20,3000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('B','GuangDong','ShenZhen',21,4000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('C','GuangDong','ShenZhen',22,3500);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('D','GuangDong','ShenZhen',21,2000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('E','GuangDong','GuangZhou',22,1000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('F','GuangDong','GuangZhou',20,3000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('G','GuangDong','GuangZhou',22,2000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('H','GuangDong','DongGuan',20,2800);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('I','GuangDong','DongGuan',24,8000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('J','GuangDong','DongGuan',25,8500);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('K','GuangDong','DongGuan',22,3000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('L','JiangSu','NanTong',23,3500);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('M','JiangSu','NanTong',30,3000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('N','JiangSu','NanTong',25,2000);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('O','JiangSu','WuXi',24,3300);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('P','JiangSu','WuXi',24,3300);
INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge,PSalary)
VALUES('Q','JiangSu','WuXi',24,3300);
二、汇总输出每个城市的工资
select PProvince,Pcity,sum(PSalary)
from TMP_Person
group by PProvince,Pcity
select distinct PProvince,Pcity,sum(PSalary) over (partition by PProvince,Pcity)
from TMP_Person
三、计算每个城市在该省的工资占比
分析:输出的记录是按每个城市一行。第一步需要汇总计算每个城市的汇总工资;第二步需要计算该城市对应省份的汇总工资
;最后将第一步结果除以第二步结果得出占比
由于汇总城市工资、汇总省份工资,是属于不同层级的汇总,无法在一个group by条件下完成处理。需要使用子查询的方式完成。
select PProvince,Pcity,
sum(PSalary), --分子
(select sum(PSalary) from TMP_Person b where b.pprovince=a.pprovince), --分母
round(sum(PSalary)/(select sum(PSalary) from TMP_Person b where b.pprovince=a.pprovince),2)*100||'%' --占比
from TMP_Person a
group by PProvince,Pcity
使用partition by计算分母,实现不同层级的汇总计算。
在sum(sum(PSalary)) over (partition by PProvince)中,sum(PSalary)先按group by PProvince,Pcity汇总计算了每个城市的工资,再以PProvince开窗,继续sum一次前面计算出来的城市汇总的工资,实现汇总省份的工资。
select PProvince,Pcity,
sum(PSalary), --分子
sum(sum(PSalary)) over (partition by PProvince), --分母
round(sum(PSalary)/sum(sum(PSalary)) over (partition by PProvince),2)*100||'%' --占比
from TMP_Person
group by PProvince,Pcity
四、计算每个城市中,比当等于或小于前员工年龄的员工的薪金总和
属于不同层级的汇总,需要子查询实现
select PName,PProvince,Pcity,PAge,PSalary,
(select sum(PSalary) from TMP_Person b
where b.pcity=a.pcity and b.page<=a.page group by pcity)
from TMP_Person a
使用order by,sum排序在当前行之前的所有行的工资
select PName,PProvince,Pcity,PAge,PSalary,
sum(PSalary) over (partition by pcity order by page)
from TMP_Person
order by PName
一、示例数据员工信息表,包括字段有:员工姓名、省份、城市、年龄、薪水CREATE TABLE TMP_Person (PName VARCHAR2(20),PProvince VARCHAR2(20),Pcity VARCHAR2(20),PAge INT,PSalary INT)INSERT INTO TMP_Person(PName,PProvince,Pcity,PAge...
DEPT_ID ENAME SAL
1 1000 A 2500
2 1000 B 3500
3 1000
0、select * from wmg_test; —测试数据
1、select v1,v2,sum(v2) over(order by v2) as sum from wmg_test;
–按照 v2排序,累计n+n-1+…+1
2、select v1,v2,sum(v2) over(partition by v1 order by v2) as sum from wmg_test;...
select sum(sal) over() from emp; --求总的和,相当于sum(sal)
select empno,sal,sum(sal) over (order by empno) from emp; --
根据empno,累加sal
select empno,sal,deptno,sum(sal) over (order by deptno,sal desc) from
原文出处:http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/
oracle的分析函数over 及开窗函数
一:分析函数over
Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是
对于每个组返回多行,而聚合函数对于每个组只返回一行。
下面通过几个例子
ALL运算符用于将聚合应用于所有值。 SUM函数默认使用ALL运算符。
例如,如果有一组集合值:(1,2,3,3,NULL)。 使用SUM函数将返回9,请注意,SUM函数忽略NULL值。
要计算唯一值的总和,可以使用DISTINCT运算符,例如,集合(1,2,3,3,NU
select * from mempays
select SUM(paynum) from mempays
select SUM(paynum) as paynums from mempays
今天分享一下mysql中的sum函数使用。该函数已经成为大家操作mysql数据库中时常用到的一个函数,这个函数统计满足条件行中指定列的和,想必肯定大家都知道了,本身就没什么讲头了,这篇文章主要是通过几个小案例深入了解一下该函数,以及在做mysql查询时如何使用sum函数做优化。
sum([distinct] expr) [over_clause]
returns the sum of expr. if the return set has no rows, sum() returns nu
1. 功能不同:
- group by是用于将数据按照指定的列进行分组,然后对每个组进行聚合操作,例如求和、计数等。
- partition by是用于在分析函数中指定分组的方式,它定义了每个分组的范围,然后在每个分组内进行计算。
2. 执行顺序不同:
- 在SQL语句的执行顺序中,group by是在where之后、select之前执行的,它先根据指定的列进行分组,然后对每个组进行聚合操作。
- partition by是在select之后执行的,它根据指定的列进行分组,并在每个分组内进行计算。
3. 使用场景不同:
- group by适用于需要对整个数据集进行分组和聚合的情况,例如统计每个部门的销售总额。
- partition by适用于需要在每个分组内进行计算的情况,例如计算每个部门的销售额占比。
下面是一个示例,演示了partition by和group by的区别:
假设有一个表sales,包含以下字段:department(部门)、product(产品)、quantity(数量)、price(单价)。
1. 使用group by计算每个部门的销售总额:
```sql
SELECT department, SUM(quantity * price) AS total_sales
FROM sales
GROUP BY department;
2. 使用partition by计算每个部门的销售额占比:
```sql
SELECT department, product, quantity * price / SUM(quantity * price) OVER (PARTITION BY department) AS sales_ratio
FROM sales;