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

2022-05-24 0 624

复制代码 代码如下:

—找出促销活动中销售额最高的职员

—你刚在一家服装销售公司中找到了一份工作,此时经理要求你根据数据库中的两张表得到促销活动销售额最高的销售员

—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

免责声明:
1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

NICE源码网 MsSql SQL语句练习实例之四 找出促销活动中销售额最高的职员 https://www.niceym.com/60387.html