2012-12-03 3 views
2

est ici le sqlonlineSomme sur Sum dans le serveur SQL?

Il y a une bande.

Chaque membre joue d'un instrument.

coût de chaque instrument X $

Je voudrais créer un rapport: combien chaque membre « coûts » au gestionnaire de bande.

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) 

Qu'est-ce que j'ai essayé?

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

mais cela donne des noms en double:

enter image description here

Je veux voir 4 dossiers qui résument les coûts de chaque nom.

p.s. : J'aurais pu créer une somme() sur toute la requête, mais je veux savoir s'il existe une meilleure solution élégante.

Répondre

4

Dans le schéma actuel, vous devrait faire

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

Mais quand vous avez beaucoup à beaucoup que vous faites normalement les relations d'une table intermédiaire avec les liens

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) 

Cela permet de dupliquer les joueurs dans la table #players et permet également aux joueurs avec le même nom à dans la même bande;)

Lire http://sqlrelationship.com/many-to-many-relationship/ pour plus d'informations

+1

Doit être 'p.name' après SELECT et GROUP BY. – pleinolijf

+0

@pleinolijf, merci d'avoir attrapé ce .. –

+0

Je sais que j'aurais dû créer une table de carte. mais la question était juste pour attraper le concept. (somme sur la somme) –

1

Vous pouvez corriger votre requête en ajoutant un groupe par, comme celui-ci:

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

Cependant, une meilleure approche serait d'utiliser une jointure:

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

l'identifiant plusieurs parties « # players.instId » ne pouvait pas être lié. –

+0

@RoyiNamir Cela devrait fonctionner maintenant. – dasblinkenlight

+0

votre deuxième requête ne fonctionne pas –