员工信息表,包括字段有:员工姓名、省份、城市、年龄、薪水

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

二、汇总输出每个城市的工资

  • group by方式
select PProvince,Pcity,sum(PSalary) 
from TMP_Person 
group by PProvince,Pcity
  • partition by方式
select distinct PProvince,Pcity,sum(PSalary) over (partition by PProvince,Pcity) 
from TMP_Person 
 

三、计算每个城市在该省的工资占比

分析:输出的记录是按每个城市一行。第一步需要汇总计算每个城市的汇总工资;第二步需要计算该城市对应省份的汇总工资

;最后将第一步结果除以第二步结果得出占比

  • group by方式

由于汇总城市工资、汇总省份工资,是属于不同层级的汇总,无法在一个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方式

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

四、计算每个城市中,比当等于或小于前员工年龄的员工的薪金总和

  • group by方式

属于不同层级的汇总,需要子查询实现

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
  • partition by方式

使用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;