Sql语句的写法?(50分)

  • 主题发起人 主题发起人 luaijun
  • 开始时间 开始时间
L

luaijun

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库中有以下表

销售人员表(Saler)
SaleId 销售人员编号 主键
Name 销售人员姓名
Dept 销售人员所属部门
Age 销售人员年龄
Salary 销售人员工资

销售人员负责销售商品表(Saler_Product)

SalerId 销售人员编号
ProductId 商品编号
二者为主键
Target 销售目标
Back 销售提成

商品表(Product)
ProductId 商品编号 主键
ProductName 商品名称
Price 商品价格
Area 商品产地
Description 商品描述

商品销售记录(SaleRecord)
SalerId 销售人员编号
ProductId 商品编号
Customer 客户名称
Time 销售时间
Number 销售数量


1.选出负责销售产品中有产地是"China" 的商品的人员姓名
2.选出负责销售两种或两种以上商品人员的姓名,部门,年龄,以及负责销售的产品数量
3.选出2000.01.01到2000.01.31这段时间内销售商品总金额在10000以上的人员姓名和销售总金额

我的sql语句如下
1.Select Name from Saler
where SalerId
in
(Select SalerId from Saler_Product
where Product.Area="China" and Product.ProductId=Saler_Product.ProductId
)

Select Name from Saler
where Product.Area="China"
and Saler.SalerId=Saler_Product.SalerId
and Saler_Product.ProdductId=Prodduct.ProdductId

这两种应该都可以,不知谁优谁劣?
2.select Name,Dept,Age,ProductId,Target from Saler,Saler_Product
where SalerId in
(select SalerId from Saler_product
group by SalerId
Having count(*)>=2
)
这样写对吗,不知不没有更好的写法
3.我不知怎么写,请大家帮忙

非常感谢
 
1.select distinct a.name from saler a,saler_product b,product c
where a.saleID=b.salerID and b.ProductId=c.ProductId
and c.Area='China'
2.select Name,Dept,Age,ProductId,Target from Saler
where SalerId in
(select SalerId from Saler_product
group by SalerId
Having count(*)>=2
)
3.select a.salerID,b.name,sum(number) n from SaleRecord a,saler b
where a.salerID=b.saleID
and b.time>=to_date('20010101','yyyymmdd')
and b.time<to_date('20010201','yyyymmdd')
group by a.salerID,b.name
having n>=10000
 
凝铁衣,谢谢您的回答,不过第三个肯定不对,要求是销售总金额,不是销售总数量,所以肯定
要涉及到Product表,应是Product.price*SaleRecord.Number>10000才对

第二个不知是不是您笔误,因为Saler没有ProductId,Target 字段,所有from必须要有
Saler_Product

再次感谢您

请指教
 
--创建表结构(Oracle8i)
create table Saler(SaleId number primary key, name varchar2(20), Dept varchar2(20), age number,

Salary number);

create table Saler_Product(SalerId number, ProductId number, Target number, Back number,

constraint PC primary key(SalerId, ProductId));

create table Product(ProductId number primary key, ProductName varchar2(20), Price number, Area

varchar2(20), Description varchar2(200));

create table SaleRecord(SalerId number, ProductId number, Customer varchar2(20), Time Date, Num

number);


1.选出负责销售产品中有产地是"China" 的商品的人员姓名
select A.Name from Saler A, Saler_Product B, Product C
where C.Area = 'China' and A.SaleId = B.SalerId and C.ProductId = B.ProductId;

2.选出负责销售两种或两种以上商品人员的姓名,部门,年龄,以及负责销售的产品数量
select A.Name, A.Dept, A.Age, B.Num
from Saler A, (select SalerId, sum(Num) Num from
(select SalerId, ProductId, sum(Num) Num
from SaleRecord
group by SalerId, ProductId having count(SalerId) >= 2)
group by SalerId) B
where A.SaleId = B.SalerId;


3.选出2000.01.01到2000.01.31这段时间内销售商品总金额在10000以上的人员姓名和销售总金额

-- 把2000.01.01到2000.01.31这段时间内的销售人员、商品、数量分组求和
select SalerId, ProductId, sum(Num) Num
from SaleRecord
where Time between TO_Date('2000.01.01', 'yyyy.mm.dd') and TO_Date('2000.01.31', 'yyyy.mm.dd')
group by SalerId, ProductId;
-- 求得总金额
select B.SalerId, sum(B.Num * A.Price)
from Product A, () B
group by B.SalerId having sum(B.Num * A.Price) > 10000;
-- 根据SalerId 求得人员姓名

--合并全部语句:
select C.Name, sum(B.Num * A.Price)
from Product A,
(select SalerId, ProductId, sum(Num) Num
from SaleRecord
where Time between TO_Date('2000.01.01', 'yyyy.mm.dd') and TO_Date('2000.01.31',

'yyyy.mm.dd')
group by SalerId, ProductId) B,
Saler C
where C.SaleId = B.SalerId
group by C.Name having sum(B.Num * A.Price) > 10000;

3条语句都可执行,至于执行结果是否跟要求相符就未经测试了
如果不出差错的话应该没问题。 至于效率方面则没有太多考虑过。
 
谢谢各位的回答,参考了各位的回答,所有问题已解决
 
后退
顶部