2017-01-25 3 views
0

Mit zwei Tabellen, Orders und OrderDetails, richten Sie sich so ein.Gruppieren nach Summe ohne direkte ID

Orders

+--------------------+ 
| ClientId | OrderId | 
+--------------------+ 
| Foo | 1  | 
| Foo | 2  | 
| Bar | 3  | 
+--------------------+ 

Orderdetails

+---------+-------+ 
| OrderId | Sales | 
+---------+-------+ 
| 1 | 10 | 
| 2 | 10 | 
| 3 | 10 | 
+---------+-------+ 

Und ich brauche eine Abfrage ohne Mitglied werden, dass die folgenden

+----------+-------+ 
|   | Total | 
| ClientId | Sales | 
+----------+-------+ 
| Foo | 20 | 
| Bar | 10 | 
+----------+-------+ 

Ideen zurückkehrt?

+1

Warum können Sie hier keinen Join verwenden? –

+1

Die Datenstruktur macht eigentlich keinen Sinn. . . Es sieht so aus, als ob orderID der Primärschlüssel beider Tabellen ist. –

Antwort

0

Hier ist eine weitere Option mit cte.
Aber wie Tim sagte join sollte die beste Lösung sein

declare @order table (ClientID varchar(3), OrderId int) 
declare @orderDetails table (OrderId int, Sales int) 

insert into @order values ('Foo', 1), ('Foo', 2), ('Bar', 3) 
insert into @orderDetails values (1, 10), (2, 10), (3, 10) 

;with ctx as (
select o.ClientID, 
     (select sum(Sales) from @orderDetails d where d.OrderId = o.OrderId) sales 
from @order o 
) 
select ClientID, SUM(sales) TotalSales 
from ctx 
group by ClientID 

-- With normal join 
select o.ClientID, SUM(d.Sales) as TotalSales 
from @order o 
left join @orderDetails d on o.OrderId = d.OrderId 
group by o.ClientID 

Sie die left join-inner join ändern können, wenn Sie genaue Übereinstimmung haben wollen.

+0

Wenn Sie den Ausführungsplan überprüfen, werden Sie feststellen, dass dieser noch als Join ausgeführt wird. –

+0

Wie würdest du es mit Join lösen? –

+0

@BaconBits Sie haben Recht ... Ich habe den Ausführungsplan nicht überprüft, eliminieren Sie einfach den Wortlaut 'Join'. Und vergleichen Sie den Ausführungsplan mit 'join', es ist genauso ... – Prisoner