在SQL服务器中求和总和?

时间:2012-12-03 14:48:11

标签: sql-server sql-server-2008

这里是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

但这会产生重复的名称:

enter image description here

我希望看到4条记录,总结每个名称的成本。

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

2 个答案:

答案 0 :(得分: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/了解详情

答案 1 :(得分: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