2017-01-25 4 views
0

Имея две таблицы, Заказы и Детали заказа, настроены так.Группа по сумме без прямого идентификатора

Заказы

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

Детали_Заказов

+---------+-------+ 
| 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 

Вы можете изменить left join к inner join, если вы хотите иметь точное совпадение.

+0

Если вы проверите план выполнения, вы обнаружите, что это все еще выполняется как соединение. –

+0

Как бы вы решили это с Join? –

+0

@BaconBits Вы правы ... Я не проверял план выполнения, просто устраните формулировку 'join'. И сравните план выполнения с 'join', это точно так же ... – Prisoner

Смежные вопросы