powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select. Неверный подсчет сумм по группе
7 сообщений из 7, страница 1 из 1
Select. Неверный подсчет сумм по группе
    #36909999
Voljka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
VFP 9.0.
Помогите, пож-ста, новичку.

Исходные данные
Nomenclature.dbf
Record#ARTICLE_NARTICLE_RZHD ARTICLE_C1 13185630219Блок 2 2 3187140649Втулка 33 3187141582 Мембрана тифона 4 4 3187141584 МЕМБРАНА ТИФОНА 5 5 3187141587 Тифон в сборе 6 6 3187141588 Пластина тифона 7 7 3187141589 Пластина тифона 8 8 3187141840 Вставка нижняя 9 9 3187141841 Вставка верхняя 10 10 3187141924 Поводок зубчатый 11 11 3187142054 Золотник 12 12 3187142059 Золотник 13 13 3187142245 Поводок 14 14 3187142251 Поводок

Positions.dbf
Record# POS_N ARTICLE QUANTITY 1 1 8 5 2 2 8 8 3 3 9 5 4 4 9 8 5 5 10 3 6 6 10 2 7 7 10 3 8 8 10 2 9 9 12 2 10 10 12 2 11 11 13 1

Article_move.dbf
Record# ARTICLE QUANTITY MOVEMENT_D POSITION 1 8 1 10/10/10 1 2 9 2 10/10/10 3 3 9 3 10/10/10 3

Reorders.Dbf
Record# BILL POSITION QUANTITY PRICE ARTICLE1 1 1 1 100.00 92 2 1 1 90.00 83 3 1 1 1000.00 8

Задача:

Создать список товаров, по которым есть заказы HAVING SUM(Positions.quantity) > ( 0 ), посчитав по каждому из товаров сколько заказано SUM(Positions.quantity), отгружено SUM(NVL(Article_move.quantity,0)) и запланировано к огрузке SUM(NVL(Reorders.quantity,0))


Запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT Nomenclature.article_n, Nomenclature.article_rzhd,;
  Nomenclature.article_c, SUM(Positions.quantity),;
  SUM(NVL(Article_move.quantity, 0 )), SUM(NVL(Reorders.quantity, 0 ));
 FROM ;
     data1!nomenclature ;
    RIGHT OUTER JOIN data1!positions ;
   ON  Nomenclature.article_n = Positions.article ;
    LEFT OUTER JOIN data1!reorders ;
   ON  Nomenclature.article_n = Reorders.article ;
    FULL JOIN data1!article_move ;
   ON  Nomenclature.article_n = Article_move.article;
 GROUP BY Nomenclature.article_n, Nomenclature.article_rzhd,;
  Nomenclature.article_c;
 HAVING  SUM(Positions.quantity) > (  0  );
 ORDER BY Nomenclature.article_n

Результат
Record# ARTICLE_N ARTICLE_RZHD ARTICLE_C SUM_QUANTITY SUM_EXP_5 SUM_EXP_6 1 8 3187141840 Вставка нижняя 26 4 4 2 9 3187141841 Вставка верхняя 26 10 4 3 10 3187141924 Поводок зубчатый 10 0 0 4 12 3187142059 Золотник 4 0 0 5 13 3187142245 Поводок 1 0 0

Суть вопроса:
В чем моя ошибка? Почему суммы рассчитываются неверно? Причем похоже, что только в записях с имеющимися данными для итогов в нескольких таблиц.
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36910033
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Voljka,

в запрос особо не вчитывался, но попробуйте решить задачку попроще: есть таблица с номерами счетов(id), и есть 2 таблицы "приход"(id,amt,dt) и "расход"(id,amt,dt). Именно две, а не одна общая. Задача - посчитать остаток на счёте на заданную дату. Напишите для себя правильное решение, и тогда, скорее всего, поймёте, где у вас ошибка в этом запросе.
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36910099
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Визуально сложно понять где ошибка.

Сделай такой запрос и посмотри что суммируется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT Nomenclature.article_n, Nomenclature.article_rzhd,;
  Nomenclature.article_c, Positions.quantity,;
  Article_move.quantity, Reorders.quantity;
 FROM ;
     data1!nomenclature ;
    RIGHT OUTER JOIN data1!positions ;
   ON  Nomenclature.article_n = Positions.article ;
    LEFT OUTER JOIN data1!reorders ;
   ON  Nomenclature.article_n = Reorders.article ;
    FULL JOIN data1!article_move ;
   ON  Nomenclature.article_n = Article_move.article;
 ORDER BY Nomenclature.article_n, Nomenclature.article_rzhd,;
  Nomenclature.article_c
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36910120
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как и у очень многих до Вас, Ваша ошибка в том, что Вы совершенно не понимаете, что же делают внешние объединения. Вот эти самые LEFT, RIGHT, FULL JOIN.

Если Вы хотите получить в одной результирующей выборке суммы по таблицам, которые связаны между собой отношением много-ко-многим (например, таблица отгрузок и плановых отгрузок), то необходимо рассчитывать суммы по каждой из них в отдельности и объединять уже результат. Т.е. либо делать подзапросы, либо просто отдельные (последовательные) запросы по каждой из таких таблиц.
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36910494
Voljka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимрМ, свою ошибку понял.
tanglir, предложенная задача действительно требует той же функциональности. Поэтому предлагаю перейти к более простой предложенной задаче.
Понял, что решать задачу нужно подзапросами или предварительно создавать таблицы с итогами.
С таблицами реализовал, так проще, конечно.
А вот с подзапросами не могу справиться.
Насколько я понимаю, у меня должно быть 2 независимых подзапроса, подсчитывающих итоги по приходу/расходу, отбирающих данные по дате.
Например, по приходу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT Account.id, SUM(Incomes.amt);
 FROM ;
     data!accounts;
    INNER JOIN data!incomes ;
   ON  Accounts.id = Incomes.id;
 WHERE income.dt={^ 2010 - 10 - 10 };
 GROUP BY Accounts.id

и расходу
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT Account.id, SUM(Outcomes.amt);
 FROM ;
     data!accounts;
    INNER JOIN data!Outcomes ;
   ON  Accounts.id = Outcomes.id;
 WHERE Outcomes.dt={^ 2010 - 10 - 10 };
 GROUP BY Accounts.id

Но, насколько я понял, привязать таблицы в VFP можно с помощью WHERE. Значит в результате подзапроса должно быть только одно поле - по которому идет привязка (id - идентификатор счета).
Тогда откуда взять сумму. Понимаю, что решения должно быть простое, но что-то никак.

Если не затруднит, сбросьте код решения задачи.
____________
Regards, Voljka
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36910630
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VoljkaНо, насколько я понял, привязать таблицы в VFP можно с помощью WHERE. Значит в результате подзапроса должно быть только одно поле - по которому идет привязка (id - идентификатор счета). не только вхере, ещё и джойн :)
Код: plaintext
1.
2.
3.
select acc.id,acc.остальные_поля_какие_надо,nvl(t0.s, 0 )-nvl(t1.s, 0 ) as balance
 from account acc 
 left join (ваш_первый_запрос) t0 on acc.id=t0.id 
 left join (ваш_второй_запрос) t1 on acc.id=t1.id
...
Рейтинг: 0 / 0
Select. Неверный подсчет сумм по группе
    #36911532
Voljka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglir,
капец, просто дай псевдоним и все..
аж стыдно.. спасибо.
_________________
regards, Voljka
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Select. Неверный подсчет сумм по группе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]