хитрый запрос
От: Аноним  
Дата: 26.01.04 13:16
Оценка:
есть некая таблица A со счетами

-----
ID,
Name,
.....
-----



и две идентичные по структуре таблицы B и С — два типа операций по счетам

------
ID,
AID, -- ссылка на A
Сount, -- сумма операции
....
------

нужен запрос выводящий сумму операций для каждого счета по типам,

хотел сделать без вложенных запросов, join'ами


select A.Name, sum(B.Count), sum(C.Count)
from A
inner join B A.ID on B.AID,
inner join C A.ID on C.AID

where .....

group by A.Name


так вот при таком запросе "не бъет" цифра... какие то левые суммы получаются...

если убрать один из

inner join B A.ID on B.AID 
inner join C A.ID on C.AID

то все нормально
Re: хитрый запрос
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.01.04 13:47
Оценка: +1
Здравствуйте, <Аноним>, Вы писали:

А>есть некая таблица A со счетами

А>так вот при таком запросе "не бъет" цифра... какие то левые суммы получаются...

ну естессно.
select A.Name, sum(B.Count), sum(C.Count)
from A
left join B on B.AID=A.ID,
left join C on C.AID=A.ID 

where .....

group by A.Name
... << RSDN@Home 1.1.3 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: хитрый запрос
От: Аноним  
Дата: 26.01.04 14:35
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


А>>есть некая таблица A со счетами

А>>так вот при таком запросе "не бъет" цифра... какие то левые суммы получаются...

S>ну естессно.

S>
S>select A.Name, sum(B.Count), sum(C.Count)
S>from A
S>left join B on B.AID=A.ID,
S>left join C on C.AID=A.ID 

S>where .....

S>group by A.Name
S>


увы... ни фига.
получается, что он в результат добавляет строки и для первого и для второго соответствия,
т.е. получаем какбы аод 2 строки с A.ID
но затем, и B.* и С.* присутсвуют значения в каждой строке. получается что они по 2 раза там.
Re[3]: хитрый запрос
От: Sinclair Россия https://github.com/evilguest/
Дата: 26.01.04 16:04
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>увы... ни фига.

А! Точно! Есть такая фигня.
А>получается, что он в результат добавляет строки и для первого и для второго соответствия,
Да-да-да.
А>т.е. получаем какбы аод 2 строки с A.ID
А>но затем, и B.* и С.* присутсвуют значения в каждой строке. получается что они по 2 раза там.
В общем, надо делать сначала group by, а уже потом join:
select A.Name, sumB, sumC
from A 
left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
... << RSDN@Home 1.1.3 beta 1 >>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: хитрый запрос
От: Аноним  
Дата: 26.01.04 16:23
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


А>>увы... ни фига.

S>А! Точно! Есть такая фигня.
А>>получается, что он в результат добавляет строки и для первого и для второго соответствия,
S>Да-да-да.
А>>т.е. получаем какбы аод 2 строки с A.ID
А>>но затем, и B.* и С.* присутсвуют значения в каждой строке. получается что они по 2 раза там.
S>В общем, надо делать сначала group by, а уже потом join:
S>
S>select A.Name, sumB, sumC
S>from A 
S>left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
S>left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
S>


блин мне надо в свою очередь B и С джоинить с таблицами B_Details и С_Details
такой крокодил получится....=(
Re[4]: хитрый запрос
От: Аноним  
Дата: 26.01.04 16:43
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, <Аноним>, Вы писали:


А>>увы... ни фига.

S>А! Точно! Есть такая фигня.
А>>получается, что он в результат добавляет строки и для первого и для второго соответствия,
S>Да-да-да.
А>>т.е. получаем какбы аод 2 строки с A.ID
А>>но затем, и B.* и С.* присутсвуют значения в каждой строке. получается что они по 2 раза там.
S>В общем, надо делать сначала group by, а уже потом join:
S>
S>select A.Name, sumB, sumC
S>from A 
S>left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
S>left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
S>



хмм... отказывается эта пакость делать вложенный запрос в left join
база MSSQL....
Re: хитрый запрос
От: KetchUp Inside aka Zig  
Дата: 26.01.04 17:08
Оценка:
как вариант могу предложить



select name, sum(b_cnt), sum(c_cnt)
from
(
   select name, isnull(count, 0) as b_cnt, 0 as c_cnt
   from a
   left join b
   on a.id = b.aid

   union all

   select name, 0 as b_cnt, isnull(count, 0) as c_cnt
   from a
   left join c
   on a.id = c.aid
) as t1

where ...

group by name



PS а left join с вложенным запросом работает без проблем — смотри внимательнее, скорее всего что-то напутал
Re[4]: хитрый запрос
От: Аноним  
Дата: 27.01.04 07:33
Оценка:
Здравствуйте, Sinclair, Вы писали:


S>
S>select A.Name, sumB, sumC
S>from A 
S>left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
S>left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
S>


а насколько оптимален такой запрос?
он во вложенном запросе выберет и сгрупирует все данные??? или уже отфильтрованые по BG.AID = A.ID
Re[5]: хитрый запрос
От: Basilisk  
Дата: 27.01.04 07:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Sinclair, Вы писали:



S>>
S>>select A.Name, sumB, sumC
S>>from A 
S>>left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
S>>left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
S>>


А>а насколько оптимален такой запрос?

А>он во вложенном запросе выберет и сгрупирует все данные??? или уже отфильтрованые по BG.AID = A.ID


А откуда внутренний запрос знает о внешнем?
Re[6]: хитрый запрос
От: Аноним  
Дата: 27.01.04 08:04
Оценка:
Здравствуйте, Basilisk, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, Sinclair, Вы писали:



S>>>
S>>>select A.Name, sumB, sumC
S>>>from A 
S>>>left join (select AID, sum(count) as sumB from B group by AID) BG on BG.AID = A.ID
S>>>left join (select AID, sum(count) as sumB from C group by AID) CG on CG.AID = A.ID
S>>>


А>>а насколько оптимален такой запрос?

А>>он во вложенном запросе выберет и сгрупирует все данные??? или уже отфильтрованые по BG.AID = A.ID


B>А откуда внутренний запрос знает о внешнем?


ну оптимизатор там например...

т.е. если у меня в A 100000 записей, и кажой из них стоит в соответствие 2-3 записи в B и С
то мне во внутренних запрсах построит болшушие таблицы по 100000 записей просумировваных, а потом из них выберет то что мне надо?
Re[5]: хитрый запрос
От: _MarlboroMan_ Россия  
Дата: 27.01.04 09:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>хмм... отказывается эта пакость делать вложенный запрос в left join

А>база MSSQL....

случайно не
Invalid column name 'count'.

???
... << RSDN@Home 1.1.3 beta 1 >>

— сколько программистов надо чтобы заменить сгоревшую лампочку?
— сколько не бери, а лампочку не поменять — проблема аппаратная, программным путем не решается...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.