2

这是sqlonline

有一个乐队。

每个成员都会演奏一种乐器。

每件乐器的价格为 X$

我想创建一个报告:每个成员对乐队经理的“成本”是多少。

create table #Inst(id int, name nvarchar(max) , price int )
insert into  #Inst values  (1,'guitar',20), 
                           (2,'bass',10),
                           (3,'drums',30),
                           (4,'piano',40) 
  
  create table #Players(id int, name nvarchar(max) , instId int )
  insert into  #Players values (1,'john',1), 
                               (2,'john',4),
                               (3,'paul',2),
                               (4,'paul',2),
                               (5,'george',1),
                               (6,'ringo',3)

我试过什么?

select name , totalCostToTheband=   
              (select sum(price) from #inst i where i.id= #players.instId ) 
from #players

但这会产生重复的名称:

在此处输入图像描述

我想查看 4 条记录,这些记录汇总了每个名称的成本。

ps: 我本可以在整个查询中创建一个 sum(),但我想知道是否有更好、更优雅的解决方案。

4

2 回答 2

4

在当前架构中,您应该这样做

SELECT 
    p.name , 
    sum(price) as totalCostToTheband
FROM
    #players p 
    INNER JOIN #inst i ON i.id = p.instId
GROUP BY
    p.name

但是当你有多对多关系时,你通常会用链接做一个中间表

create table #Inst(id int, name nvarchar(max) , price int )
create table #Players(id int, name nvarchar(max) )
create table #instplayer(id int, inst_id, player_id )

这样可以避免重复#players表内的玩家,并且还允许同名的玩家在同一个乐队中;)

阅读http://sqlrelationship.com/many-to-many-relationship/了解更多信息

于 2012-12-03T14:52:38.387 回答
1

您可以通过添加组来修复您的查询,如下所示:

select p.name
,   (select sum(price) from #inst i where i.id= p.instId ) as totalCostToTheband
from #players p
group by p.name

但是,更好的方法是使用连接:

select p.name, sum(i.price) as totalCostToTheband
from #players p
join #inst i on i.id=p.instId
group by p.name
于 2012-12-03T14:52:10.470 回答