К списку форумов К списку вопросов
Замучился уже, ну помогите кто нибудь..... SQL запрос
BELL
02.08.2004 - 11:56
Замучился.. Помогите, помираю..
Вопрос такой
3 таблицы. Население, оплата, начисления.
Нужно все свести в один запрос, где
Население.ФИО, СУММА начисления, СУММА оплаты..
Дело в том, что если не одно начисление и не одна оплата (и если разное кол-во оных) то по оператору SUM запрос умножает суммы на колво записей и делает несколько записей..
Например, запись В Население - Ивонов И.И., оплаты 2 по 100 руб, начисление 1 по 200 руб. Получается 2 записи с ивановым, начисления по 200 руб, оплаты по 100, итог: оплата верная, начисление 400 руб....
Помогите наконец! Запросом...
Big Duck
1 - 02.08.2004 - 13:02
допустим, во всех таблицах есть поле ID_Fam - идентификатор фамилии ссылающийся на таблицу с населением People тогда получаем такой запрос:
select t1.ID_Fam, MAX(ta.Surname), SUM(t2.Oplat), SUM(t3.nachisl)
from people t1
left join Oplaty t2 on t2.id_fam = t1.id_fam
left join Nachislenia t3 on t3.id_fam = t1.id_fam
group by t1.id_fam
--------
типа так.........
BELL
2 - 02.08.2004 - 14:48
Обьясни, если t1,t2 и t3 таблицы, то кто тогда people, Oplaty, Nachislenia и что значит people t1 ?? Oplaty t2 ??
Вот мой запрос, составленный по аналогии с твоим
SELECT [Население].[Уникод], [Население].[Лицевой_счет], MAX([Население]![Фамилия]), SUM(Заявки_ТО.Начисления), SUM(Заявки_ТО.Сумма_Оплаты)
FROM Население
LEFT JOIN Заявки_ТО ON Население.Уникод = Заявки_ТО.Уникод_абонента
LEFT JOIN Оплата_ТО ON Население.Уникод = Оплата_ТО.Уникод_абонента
GROUP BY Население.Уникод
Оно не работает, ошибки синтаксиса -) Щас исправлять буду
BELL
3 - 02.08.2004 - 14:55
Не работает. Начисления умножаются, оплата умножается...
Могу дать файл акцесса для экспериментов, щас закачаю на http://flameworld.da.ru/db.rar
BELL
4 - 02.08.2004 - 14:56
запрос "Запрос"
Big Duck
5 - 02.08.2004 - 17:15
t1, t2, и t3 - это алиасы таблиц для ленивых, как я, чтоб не писать название таблицы полностью :)
А если это акцес - напиши запрос сам! дизайнер запросов нам весьма дебильный (на мой взгляд)
а не получилось у тебя, возможно, потому, что группировка идет по идентификатору "Населения", а выводишь рядом еще какую-то хрень без агрегативной финкции - Лицевой_счет. Если он тебе нужен - тож напиши ему MAX......
И еще - точно убедись, что у тебя написано именно left join, а то твоя ситуация весьма напоминает просто join.......
tetradon
6 - 02.08.2004 - 22:06
А запрос для SQL сервера или для ODBC ?
Big Duck
7 - 02.08.2004 - 22:40
Какая разница?! - в приведенном примере используется совершенно стандартный SQL, который поддерживают все СУБД со всеми диалектами!
И что в твоем понимании ODBC? :) Если не ошибаюсь, ODBC - Object DataBase Connection, то бишь объект связи с БД, - интерфейс, через который идет обращение к БД :) И как это вообще возможно - для него персонально писать запросы? :)
tetradon
8 - 02.08.2004 - 23:27
Z Я имел в веду ODBC для баз данных типа dbf. Если реч идет о MSSQL это одно. Если о файловых база к которым с помощью ODBC можноьформировать SQL запрос это совсем другое. Так о какой базе идет речь ?
tetradon
9 - 02.08.2004 - 23:50
BELL Напиши свой запрос.
BELL
10 - 03.08.2004 - 08:51
Вот мой запрос:
SELECT Население.Уникод, Max(Население.Лицевой_счет) AS [Max-Лицевой_счет], Max([Население]![Фамилия]) AS ФИО, Sum(Заявки_ТО.Стоимость) AS Начислено, Sum(Оплата_ТО.Сумма_оплаты) AS Оплачено
FROM (Население LEFT JOIN Заявки_ТО ON Население.Уникод = Заявки_ТО.Уникод_абонента) LEFT JOIN Оплата_ТО ON Население.Уникод = Оплата_ТО.Уникод_абонента
GROUP BY Население.Уникод;
---------
беспролезно, все равно умножает.... Ну помогите же...
Если оплат больше 1, то он начисления умножает на кол-во оплат...
Grigoriy
11 - 03.08.2004 - 09:26
Используй временные таблицы, в которых своди все оплаты и начилсения к одной строке, путем суммирования.
BELL
12 - 03.08.2004 - 13:30
Пока так и делаю, но приходится в цикле прогонять таблицу - по времени очень уж долго (
Sergini
13 - 03.08.2004 - 13:59
Мне бы твои проблемы:
Создай запрос "ОплатаИтог":
SELECT Оплата_ТО.Уникод_абонента AS Уникод_абонента, Sum(Оплата_ТО.Сумма_оплаты) AS Сумма
FROM Оплата_ТО
GROUP BY Оплата_ТО.Уникод_абонента;
Создай запрос "ЗаявкиИтог":
SELECT Заявки_ТО.Уникод_абонента AS Уникод_абонента, Sum(Заявки_ТО.Стоимость) AS Стоимость
FROM Заявки_ТО
GROUP BY Заявки_ТО.Уникод_абонента;
Создай итоговый запрос(уже можно без группировок):
SELECT Население.Уникод, Население.Лицевой_счет, [Население]![Фамилия] AS ФИО, ЗаявкиИтог.Стоимость AS Начислено, ОплатаИтог.Сумма AS Оплачено
FROM (Население LEFT JOIN ОплатаИтог ON Население.Уникод = ОплатаИтог.Уникод_абонента) LEFT JOIN ЗаявкиИтог ON Население.Уникод = ЗаявкиИтог.Уникод_абонента;
Всё!!!
BELL
14 - 03.08.2004 - 14:39
Чтоб я сдох! Чтоб меня блохи замучили!
Все, нафик все, ухожу в отпуск... Такое простое решение......
Спасибо!

К списку вопросов на форуме Программирование

>>