Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GROUP BY не допускает подзапросы  
V
    Опции темы
MadCoder
  Дата 23.2.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

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



Добрый день!

БД: Microsoft SQL Server 2005.

Базы данных:

Contracts
contr_id int
bank_id     int
schet     numeric(18,2)

Banks
bank_id int
bank_name nvarchar(255)

Results
res_id int
res_type int

Payments
pay_id int
pay_sum numeric(18,2)


Нужно выгрузить данные в следующем виде:
* Наименование банка
* Всего контрактов у этого банка
* Кол-во контратов с результатами у этого банка
* Общий счет (schet) контрактов у этого банка
* Всего оплат у этого банка
* Всего договоров с результатом (res_type = 1) у этого банка.

Понятно, что нужно использовать GROUP BY... Но в процессе написания запроса возникла проблема: GROUP BY исключает применение вложенных запросов, а как по-другому узнать кол-во оплат у контракта например?

Вот мой запрос:
Код
select ba.bank_name as 'Банк', 
count(distinct co.contr_id) as 'Кол-во договоров',
count(select top 1 contr_id from Results where contr_id = co.contr_id) as 'Кол-во договоров с результатом у этого банка (не работает)',
sum(co.schet) as 'Сумма счетов всех договоров банка',
sum(select sum(pay_sum) from Payments where contr_id = co.contr_id) as 'Кол-во оплат у всех договоров этого банка (не работает)',
count(select top 1 res_id from Results where contr_id = co.contr_id and res_type = 1) as 'Кол-во договоров с результом 1 у этого банка (не работает)'

from Contracts as co
left join Banks as ba on ba.bank_id = co.bank_id

group by ba.bank_name
order by ba.bank_name


Подскажите, как решить эту задачку? smile 
PM WWW ICQ   Вверх
Akina
Дата 23.2.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(MadCoder @  23.2.2009,  17:02 Найти цитируемый пост)
GROUP BY исключает применение вложенных запросов, а как по-другому узнать кол-во оплат у контракта например?

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Kbl4AH
Дата 25.2.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

select a, b from
(select тыры-пыры as a, чики-пуки as b from тыры-пуки, чики-пыры ... и т.п.)
group by a [, b]

т.е сделайте ваш запрос без group by, как и советовал Akina , а потом обработайте возвращаемые им данные с group by
PM MAIL ICQ   Вверх
MadCoder
Дата 25.2.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

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



Спасибо, просвятили smile. smile 
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




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


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

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