Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL. Можно ли один запрос на сумму и кол-во сразу? 
V
    Опции темы
Nowichok
Дата 18.8.2009, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 23.11.2006

Репутация: нет
Всего: нет



Имеются таблицы:
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


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

Возможно ли вообще сделать, как я хочу ?
PM MAIL   Вверх
Ипатьев
Дата 18.8.2009, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: нет
Всего: 37



Вы хоть понимаете, что выбираете не из таблицы "смета" и таблицы "учреждение", а из результирующей таблицы, которая является произведением этих двух?
PM MAIL   Вверх
pavelv
Дата 18.8.2009, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



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

 Однако к вам вопрос, поле Id_uch уникальное для какой-то из таблиц, или для обеих сразу? Думаю когда вы ответите на этот вопрос сами напишите ответ к теме, ну нет так поможем smile.
PM MAIL   Вверх
kobra
Дата 18.8.2009, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



да...
кажется ви совсем запутаите человека  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 нужен чтобы не потерять те учереждения, для которых нет смет.
PM MAIL   Вверх
pavelv
Дата 18.8.2009, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



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

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

Не судите строго если чво неправильно сказал smile.
PM MAIL   Вверх
Nowichok
Дата 18.8.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 23.11.2006

Репутация: нет
Всего: нет



Ээээм.
ID_uch - ключевое и неповторимое поле у Uchrezdenie
У сметы ключевое поле другое - n_smeti

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

Собственно, думаю, что легче сделать отдельными зпросами. Уже сделал. Просто интересно было smile
PM MAIL   Вверх
kobra
Дата 19.8.2009, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



Цитата(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 
PM MAIL   Вверх
pavelv
Дата 20.8.2009, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 245
Регистрация: 5.2.2006

Репутация: нет
Всего: нет



Код

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 очень врятли. Хотя один оператор условия исправит проблему.

Про каунт ты прав конечно, я немного о другом говорил. Имелось ввиду, что если просто делать коунт записей(по *)...если по ид сметы, то всё будет нормально. 
PM MAIL   Вверх
kobra
Дата 20.8.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.