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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐