Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > SQL. Можно ли один запрос на сумму и кол-во сразу?


Автор: Nowichok 18.8.2009, 06:23
Имеются таблицы:
Uchrezdenie
Smeta

Нужно получить сумму полей из таблицы Uchrezdenie по округу 'ЦАО' (к примеру). Так же нужно получить кол-во смет на этот же округ.
(таблицы связаны между собой полем ID_uch).

По идее можно и в два отдельных запроса делать, но хочется, чтобы код был компактным, тем более таблицы то связаны меж собой.

Пытаюсь написать:
Код

Select Sum(Uchrezdenie.Summa_po_planu), COunt(Smeta.Id_uch)
From Uchrezdenie, Smeta
 Where Uchrezdenie.Okrug='ЦАО' AND Smeta.Id_uch=Uchrezdenie.Id_uch


Этот запрос даже обрабатывается, НО - цифры получаются неверные. И даже не смог понять, откуда эти цифры.

Возможно ли вообще сделать, как я хочу ?

Автор: Ипатьев 18.8.2009, 07:52
Вы хоть понимаете, что выбираете не из таблицы "смета" и таблицы "учреждение", а из результирующей таблицы, которая является произведением этих двух?

Автор: pavelv 18.8.2009, 08:22
Да запрос действительно непонятно, что вернёт. Тоесть при некоторых условиях наложенных на таблицы, при учете что в таблице смета всегда есть данные для таблицы учреждения там может и получится что-то похожее на правду. Это так навскиду.

 Однако к вам вопрос, поле Id_uch уникальное для какой-то из таблиц, или для обеих сразу? Думаю когда вы ответите на этот вопрос сами напишите ответ к теме, ну нет так поможем smile.

Автор: kobra 18.8.2009, 09:12
да...
кажется ви совсем запутаите человека  smile 
Код

Select Uchrezdenie.Id_uch, Sum(Uchrezdenie.Summa_po_planu), COunt(Smeta.Id_uch)
From Uchrezdenie left join Smeta on
 Smeta.Id_uch=Uchrezdenie.Id_uch AND Uchrezdenie.Okrug='ЦАО'
group by Uchrezdenie.Id_uch 

left join нужен чтобы не потерять те учереждения, для которых нет смет.

Автор: pavelv 18.8.2009, 10:19
kobra, а если на каждый Uchrezdenie.Id_uch приходится несколько(N штук) Smeta.Id_uch, то какое число у тебя получится в Sum(Uchrezdenie.Summa_po_planu)? умноженное на N наверное должно быть, если конечно я не путаю ничего?

Да и условия where не хватает на Uchrezdenie.Okrug='ЦАО'? И плюс ко всему в Count не учитывается, что туда могут попасть NULL элементы, а это минус -1 нужно сделать. 

Не судите строго если чво неправильно сказал smile.

Автор: Nowichok 18.8.2009, 17:33
Ээээм.
ID_uch - ключевое и неповторимое поле у Uchrezdenie
У сметы ключевое поле другое - n_smeti

одному учреждению может приходиться несколько смет.
Но одна смета может быть только на одно учреждение.

Собственно, думаю, что легче сделать отдельными зпросами. Уже сделал. Просто интересно было smile

Автор: kobra 19.8.2009, 09:17
Цитата(pavelv @  18.8.2009,  10:19 Найти цитируемый пост)
Не судите строго если чво неправильно сказал

будем судить, и очен строго smile 

Цитата(pavelv @  18.8.2009,  10:19 Найти цитируемый пост)
а если на каждый Uchrezdenie.Id_uch приходится несколько(N штук) Smeta.Id_uch, то какое число у тебя получится в Sum(Uchrezdenie.Summa_po_planu)? 
group by Uchrezdenie.Id_uch гарантирует что получится одна, реалная сумма всех смет для каждого учереждения. 
Цитата(pavelv @  18.8.2009,  10:19 Найти цитируемый пост)
Да и условия where не хватает на Uchrezdenie.Okrug='ЦАО'?

условие перенесено в отнашение
Цитата(kobra @  18.8.2009,  09:12 Найти цитируемый пост)
on
 Smeta.Id_uch=Uchrezdenie.Id_uch AND Uchrezdenie.Okrug='ЦАО'

Цитата(pavelv @  18.8.2009,  10:19 Найти цитируемый пост)
И плюс ко всему в Count не учитывается, что туда могут попасть NULL элементы, а это минус -1 нужно сделать. 
каккже в каличество может попасть нечего?
Цитата(Nowichok @  18.8.2009,  17:33 Найти цитируемый пост)
Собственно, думаю, что легче сделать отдельными зпросами.

ты хозяин smile 

Автор: pavelv 20.8.2009, 13:04
Код

from Uchrezdenie left join Smeta on
 Smeta.Id_uch=Uchrezdenie.Id_uch AND Uchrezdenie.Okrug='ЦАО'

На каждую запись в Учреждении появится по несколько записей смет и в этом случае  Sum(Uchrezdenie.Summa_po_planu) должно вернуть сумму всех записей. Почему вы думаете, что group by за вас будет отбрасывать записи в сум и не будет этого делать в count? Возможно есть какие-то стандарты sql  которых это и будет выполнено, но кароче что-то я недогоняю.

Цитата

Да и условия where не хватает на Uchrezdenie.Okrug='ЦАО'?
условие перенесено в отнашение

видимо не понимаем друг друга. Условие where отличается от условий left join. Если добавить условие по округу в where оно автоматически попадёт в Left, а наоборот просто на каждую запись которая не является округом ЦАО не будет выборки из таблицы смета. Блин надеюсь пояснил мысль smile. Тоесть в этом случае количество записей конечно должно совпасть(count тобишь), но вот sum очень врятли. Хотя один оператор условия исправит проблему.

Про каунт ты прав конечно, я немного о другом говорил. Имелось ввиду, что если просто делать коунт записей(по *)...если по ид сметы, то всё будет нормально. 

Автор: kobra 20.8.2009, 14:15
Цитата(pavelv @  20.8.2009,  13:04 Найти цитируемый пост)
Почему вы думаете, что group by за вас будет отбрасывать записи в сум и не будет этого делать в count?
наобарот, я думаю что нужные записи будут вклучени и там и там.
Цитата(pavelv @  20.8.2009,  13:04 Найти цитируемый пост)
Тоесть в этом случае количество записей конечно должно совпасть(count тобишь), но вот sum очень врятли. Хотя один оператор условия исправит проблему.
тут кажется ты прав. я с начало не правилно понял задачу, так что Uchrezdenie.Okrug='ЦАО' должно было быть в where.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)