powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание двух сум (80lvl)
8 сообщений из 8, страница 1 из 1
Вычитание двух сум (80lvl)
    #38848268
Ark Bucky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблицы с доходами (profit_table1, profit_table2, profit_tableN)
и одна таблица с выплатами (payoffs_table)

Необходимо просуммировать суммы доходов и от итоговой суммы отнять просуммированную выплату.

Примерно так:
авторSELECT SUM(total_profit) AS total_profit FROM (
SELECT SUM(pt1.total_seller_profit) AS total_profit FROM profit_table1 pt1 WHERE pt1.seller_id=1
UNION
SELECT SUM(pt2.total_seller_profit) AS total_profit FROM profit_table2 pt2 WHERE pt2.seller_id=1
UNION
SELECT SUM(ptN.total_seller_profit) AS total_profit FROM profit_tableN ptN WHERE ptN.seller_id=1
), (SELECT SUM(amount) FROM payoffs_table WHERE seller_id=1) AS total_paid, (total_profit-total_paid) AS total_remain_amount

должно получиться три колонки:
total_profit, total_paid, total_remain_amount


Возможно ли такое средствами MySQL без привлечения програмных средств (php, python, etc.) ?
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38848278
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ark Bucky,

1. Дайте упрошеный пример исходных данных
(5-7 строк) и ожидаемый результат.

2. Чем плох проведеный вами варинат?
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38848285
Ark Bucky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. сделал тестовые данные, в аттаче

2. приведенный мной вариант плох тем что он не рабочий
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38848295
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ark Bucky,

Ок, более-менее понятно.

1. МуСКЛ (и наверно все ДБ) не умеют
делать запросы на заранее неизвесные таблицы.
т.е. нельзя сказать
select * from profit_table*

2. По всем правилам хорошего тона у вас
дожна быть ОДНА таблица profit_table.
Возможно с дополнительным полем который
дескриминирует на тип записи profit_table1,
profit_table2, итд.
На самом деле и выплаты тоже должны быть в тойже таблице.

3. Если сможете свести все в одну таблицу, то
дальше элементарная группировка по
seller_id и SUM() решит проблему.

4. если обьединить нельзя, то извольте
написать UNION ALL для всех profit_tableN и таблицы выплат
и сделать в пункте #3.

5. ПОлезно сделать VIEW..UNION ALL на все profit_tableN и таблицы выплат
который приведет варинат #4 к варианту #3.

6. Примерна так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  sum((tx_type='PROFIT')*amt) total_profit, 
  -sum((tx_type='PAID')*amt) total_paid, -- внимание, смена знака
  sum(amt) total_remain_amount
from
( 
  select seller_id, total_seller_profit amt, 'PROFIT' tx_type from profit_table1
  UNION ALL
  select seller_id, total_seller_profit amt, 'PROFIT' tx_type from profit_table2
  UNION ALL
  select seller_id, total_seller_profit amt, 'PROFIT' tx_type from profit_table3
  .........
  UNION ALL
  select seller_id, total_seller_profit amt, 'PROFIT' tx_type from profit_tableN
  UNION ALL
  select seller_id, -amount  amt,'PAID'  tx_type -- внимание, смена знака
) zz
GROUP BY 
  sellect_id
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38848323
mwanaanga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ark Bucky,

MySQL позволяет объявлять prepared statements, у которых строка запроса задаётся в виде пользовательской переменной:

Код: sql
1.
2.
3.
4.
SET @var = 'SELECT ...';
PREPARE stmt FROM @var;
EXECUTE stmt ....;
...


Таким образом, чтобы не потребовались внешние скриптовые языки, достаточно создать и вызывать хранимую процедуру:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE PROCEDURE foo(...)
BEGIN
    SET @var = 'SELECT ...';
    WHILE ... DO
        SET @var = CONCAT(@var, ...);
        ...
    END WHILE;
    PREPARE stmt FROM @var;
    EXECUTE stmt ...;
END
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38848873
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mwanaanga, прежде чем советовать костыль, надо убедиться, что без него никак. Мы пока не знаем, может ли ТС менять структуру таблиц.
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38849161
Ark Bucky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за советы и предложения.
потестив запросы, пришел к выводу что их производительность не укладывается в приемлемые рамки.

структура таки придется менять. вопрос решен
...
Рейтинг: 0 / 0
Вычитание двух сум (80lvl)
    #38850013
lamer yuga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ark BuckyЕсть таблицы с доходами (profit_table1, profit_table2, profit_tableN)
и одна таблица с выплатами (payoffs_table)

Необходимо просуммировать суммы доходов и от итоговой суммы отнять просуммированную выплату.

должно получиться три колонки:
total_profit, total_paid, total_remain_amount


Возможно ли такое средствами MySQL без привлечения програмных средств (php, python, etc.) ?
почему бы не так?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
  @p:=IFNULL((
    SELECT SUM(total_seller_profit) FROM profit_table1 WHERE seller_id=1
    ),0)
  +IFNULL((
    SELECT SUM(total_seller_profit) FROM profit_table2 WHERE seller_id=1
    ),0)
  +...+IFNULL((
    SELECT SUM(total_seller_profit) FROM profit_tableN WHERE seller_id=1
    ),0) AS total_profit,
  @s:=IFNULL((
    SELECT SUM(amount) FROM payoffs_table WHERE seller_id=1
    ),0) AS total_paid,
  @p-@s AS total_remain_amount;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вычитание двух сум (80lvl)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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