SQL语句练习实例之四 找出促销活动中销售额最高的职员

代码如下:

---找出促销活动中销售额最高的职员 
---你刚在一家服装销售公司中找到了一份工作,此时经理要求你根据数据库中的两张表得到促销活动销售额最高的销售员 
---1.一张是促销活动表 
---2.一张是销售客列表 
create table Promotions 
( 
activity nvarchar(30), 
sdate datetime, 
edate datetime 
) 
insert Promotions 
select '五一促销活动','2011-5-1','2011-5-7' 
union 
select '十一促销活动','2011-10-1','2011-10-7' 
union 
select 'OA专场活动','2011-6-1','2011-6-7' 
go 
create table sales 
( 
id int not null, 
name nvarchar(20), 
saledate datetime, 
price money 
) 
go 
insert sales 
select 1,'王五','2011-5-1',1000 union 
select 1,'王五','2011-5-2',2000 union 
select 1,'王五','2011-5-3',3000 union 
select 1,'王五','2011-5-4',4000 union 
select 1,'张三','2011-5-1',1000 union 
select 1,'张三','2011-5-3',2000 union 
select 1,'张三','2011-5-4',4000 union 
select 1,'李四','2011-5-6',1000 union 
select 1,'赵六','2011-5-5',1000 union 
select 1,'钱七','2011-5-8',1000 union 

select 1,'孙五','2011-6-1',1000 union 
select 1,'孙五','2011-6-2',2000 union 
select 1,'王五','2011-6-3',3000 union 
select 1,'孙五','2011-6-4',4000 union 
select 1,'张三','2011-6-1',11000 union 
select 1,'张三','2011-6-3',20000 union 
select 1,'张三','2011-6-4',4000 union 
select 1,'李四','2011-6-6',1000 union 
select 1,'赵六','2011-6-5',1000 union 
select 1,'钱七','2011-6-8',1500 union 

select 1,'孙五','2011-10-1',11000 union 
select 1,'孙五','2011-10-2',12000 union 
select 1,'王五','2011-10-3',9000 union 
select 1,'孙五','2011-10-4',4000 union 
select 1,'张三','2011-10-1',11000 union 
select 1,'张三','2011-10-3',2000 union 
select 1,'张三','2011-10-4',4000 union 
select 1,'李四','2011-10-6',27000 union 
select 1,'赵六','2011-10-5',9000 union 
select 1,'钱七','2011-10-8',3000 
go 
-----我们需要找出在每次的促销活动中,其销售总额大于 等于 
---所有其他职员销售额的职员及促销事件。 
---说明:谓词a2.name<>a.name将其他职员从子查询合计中排除出去 
---------谓词Between 中的子查询确保我们使用了正确的促销日期 

--方法一: 
select a.name,b.activity,SUM(a.price) as totalprice 
from sales a ,Promotions as b 
where a.saledate between b.sdate and b.edate 
group by a.name,b.activity 
having SUM(price)>= all(select SUM(price) from sales a2 
where a2.name<>a.name and a2.saledate between 
( 
select sdate from Promotions as b2 where b2.activity=b.activity 
) 
and (select edate from Promotions b3 
where b3.activity=b.activity) 
group by a2.name) 
----------------- 

---方法二: 
---说明: 如果促销活动时间是不重叠的,则promotions表中只有一个主键列,这样在group by 
--子句中使用(activity,sdate,edate)将不会改变。但是它将使having子句可以使用sdate和edate 
select a.name,b.activity,SUM(a.price) as totalprice 
from sales a ,Promotions as b 
where a.saledate between b.sdate and b.edate 
group by b.activity,b.sdate,b.edate,a.name 
having SUM(price)>= all(select SUM(price) from sales a2 
where a2.name<>a.name and a2.saledate between 
b.sdate 
and b.edate 
group by a2.name) 

go 

--方法三: 
---使用cte(sql 2005以后的版本) 
with clearksTotal(name,activity,totalprice) as 
( 
select a.name,b.activity,SUM(price) 
from sales a ,Promotions b 
where a.saledate between b.sdate and b.edate 
group by a.name,b.activity 
) 

select c1.name,c1.activity,c1.totalprice 
from clearksTotal c1 
where totalprice=(select MAX(c2.totalprice) from clearksTotal c2 
where c1.activity=c2.activity) 
go 
drop table Promotions 
go 
drop table sales

相关推荐