这里是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条记录,总结每个名称的成本。
P.S。 : 我可以在整个查询中创建一个sum(),但我想知道是否有更好,更优雅的解决方案。
答案 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
表中的玩家,并且允许同名玩家在同一个乐队中;)
答案 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