Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RusFAQ.ru: Базы данных SQL


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Выпуск № 247
от 07.05.2007, 18:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 419, Экспертов: 54
В номере:Вопросов: 1, Ответов: 2


Вопрос № 85112: Огромная просьба помочь в решении вопроса! Существует 4 таблицы: Организации, Договора, Счета к оплате, Платежи Количество договоров у организаций может быть любым. Количество счетов к оплате по договору также может быть любым, также как ...

Вопрос № 85.112
Огромная просьба помочь в решении вопроса!
Существует 4 таблицы:
Организации, Договора, Счета к оплате, Платежи
Количество договоров у организаций может быть любым. Количество счетов к оплате по договору также может быть любым, также как и платежей (количество платежей может не соответсвовать количеству счетов к оплате)
Структуры таблиц
1) t1
ID NAME
2) t2
DID From_ID
3) t3
SID From_DID S_SUM
4) t4
PID From_DID From_SID P_SUM
Необходимо вывести на каждую организацию разность суммы счетов к оплате и платежей, сумму счетов к оплате, сумму платежей по всем договорам организации.
name,SUM(S_SUM)-SUM(P_SUM),SUM(S_SUM),SUM(P_SUM)
Заранее благодарен!

Приложение:

Отправлен: 02.05.2007, 17:35
Вопрос задал: Гарифянов Ильнар Ильдарович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Синельников Сергей
Здравствуйте, Гарифянов Ильнар Ильдарович!

Вот как-то так:

select name, SUM(S_SUM-P_SUM),SUM(S_SUM),SUM(P_SUM) FROM t1 left outer join (t2 left outer join t3 on t2.did=t3.from_did left outer join t4 on t2.did=t4.from_did) on t1.id=t2.from_id group by name

но, существет одна беда. Если нет ни одного платежа по договору или нет ни одного счета по договору, то SUM будет давать null. По этой же причине надо использовать left outer join, а не Вашу конструкцию связи таблиц. В Вашем варианте такие договора просто не попадут в выборку.
Ответ отправил: Синельников Сергей (статус: 3-ий класс)
Ответ отправлен: 03.05.2007, 07:26
Оценка за ответ: 3

Отвечает: Игорь Елизаров
Здравствуйте, Гарифянов Ильнар Ильдарович!
в данном случае надо использовать вложенные запросы, которые отдельно считают суммы счетов и оплат, например
select t1.name , t3.s_sum - tt4.sum_p
from t1 inner join t2 on t1.id = t2.from_id
left join t3 on t2.did = t3.from_did
left join (select from_sid, sum (s_sum) as sum_p from t4 group by from_sid) tt4
on t3.sid=tt4.from_sid


то есть для каждого счета вычисляем сумму оплат
---------
Пользователь - тоже человек..
Ответ отправил: Игорь Елизаров (статус: 10-ый класс)
Ответ отправлен: 03.05.2007, 09:27
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 (beta) от 02.05.2007
Яндекс Rambler's Top100

В избранное