2017-01-25 3 views
0

OrdersとOrderDetailsという2つのテーブルを持つように設定します。ダイレクトIDを持たない合計でグループ化

受注

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

たOrderDetails

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

そして、私はどんなことなく、クエリを必要とするには、それは次のよう

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

アイデアを返しましょうか?

+1

ここで結合を使用できないのはなぜですか? –

+1

データ構造は実際には意味がありません。 。 。 'orderID'が両方のテーブルのプライマリキーであるように見えます。 –

答えて

0

ここではcteを使用する別のオプションがあります。
しかし、ティムが言ったように、joinは、あなたが完全に一致を持つようにしたい場合は最善の解決策

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 

あなたはinner joinleft joinを変更することができなければなりません。

+0

実行計画をチェックすると、これは依然として結合として実行されています。 –

+0

どのようにJoinでそれを解決しますか? –

+0

@BaconBitsあなたは正しいです...私は実行プランをチェックしていませんでした。実行計画と 'join'を比較すると、まったく同じです... – Prisoner

関連する問題