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 に答える