![]() |
![]() |
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 |
Чтоб я сдох! Чтоб меня блохи замучили! Все, нафик все, ухожу в отпуск... Такое простое решение...... Спасибо! |