以下情况可以使用Sql join解决方案吗?

时间:2017-03-08 17:53:07

标签: sql sql-server-2012

我们可以用连接解决下面的情况,我用窗口函数解决了

关系:在下表中,Orders表中的每个订单都通过引用Customer表中ID列的cust_id外键列与给定Customer相关联。

问题:查找每个销售人员的最大订单金额以及关联的订单号,以及该订单所属的客户和销售人员姓名。

Create Table Salesperson 
(
    ID          int,
    name        varchar(100),
    age         float,  
    salary      money
);

Create Table Orders
(
    Number          int,
    order_date      datetime,
    cust_id         int,    
    salesperson_id  int,
    Amount          money
);

Create Table Customer
(
    ID              int,
    name            varchar(100),
    city            varchar(100),   
    IndustryType    varchar(100)
);

insert into Salesperson  values 
( 1,'Rohit',25,50000),
( 2,'Pramod',25,50000),
( 3,'Atul',25,50000);

insert into Orders values 
( 1,getdate(),101,1,50000),
( 2,getdate(),101,1,500000),
( 3,getdate(),102,1,10000),
( 4,getdate(),101,2,5000),
( 5,getdate(),102,2,700000),
( 6,getdate(),102,2,10000);

insert into Customer values 
( 101,'Altu','bhopal','IT'),
( 102,'bltu','bhopal','ITES'),
( 103,'cltu','bhopal','NW');

关于窗口功能的解决方案:

with CTE_MaxAmount
as
(
    select max(amount) over (partition by salesperson_id ) as amount,
           dense_rank() over (partition by salesperson_id order by amount) as rowid,
           cust_id,
           salesperson_id,number 
    from   Orders with(nolock)
)
select ct.amount, 
       ct.cust_id,
       c.name as customername,
       s.name as salesman,
       ct.salesperson_id,
       number as OrderNumbner 
from   Customer c 
join   CTE_MaxAmount ct 
on     (c.id = ct.cust_id)
join   Salesperson s 
on     (s.id = ct.salesperson_id)
where  rowid = 1;

1 个答案:

答案 0 :(得分:2)

我违反了我的个人政策,不回答家庭作业问题,因为这个问题是一个展示英语如何轻松翻译成SQL的机会。问题的确是完全可以建立查询。

  

找到每位销售员的最大订单金额

select max(Amount) as Amount, salesperson_id from Orders group by salesperson_id
  

以及相关的订单号

select o.Number, M.salesperson_id, M.Amount
from Orders as o join (
    select max(Amount) as amount, salesperson_id
    from Orders group by salesperson_id
) as M
on   o.salesperson_id = M.salesperson_id
and o.Amount = M.Amount 
  

与客户一起

select c.name, o.Number, M.salesperson_id, M.Amount
from Orders as o join (
    select max(Amount) as amount, salesperson_id
    from Orders group by salesperson_id
) as M
on   o.salesperson_id = M.salesperson_id
and o.Amount = M.Amount
join Customer as c
on o.cust_id = c.ID
  

和销售人员姓名

select s.name as 'salesperson',
c.name as 'customer',
o.Number, M.salesperson_id, M.Amount
from Orders as o join (
    select max(Amount) as amount, salesperson_id
    from Orders group by salesperson_id
) as M
on   o.salesperson_id = M.salesperson_id
and o.Amount = M.Amount
join Customer as c
on o.cust_id = c.ID
join Salesperson as s
on o.salesperson_id = s.ID