Группировка с 2 таблицами без объединения - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть две таблицы: MOV и RENT

Структура таблицы

           RENT
   +----------+------+-----+-----+
   |data      |   C  |  M  |  A  |
   +----------+------+-----+-----+
   |01/01/2020|   1  |  2  |  3  |
   +----------+------+-----+-----+
   |02/01/2020|   2  |  3  |  4  |
   +----------+------+-----+-----+
   |03/01/2020|   3  |  4  |  5  |
   +----------+------+-----+-----+

        MOV
   +---+-------+---------+
   |id | valor |tp_fundo |
   +---+-------+---------+
   |1  |100    |  C      |
   +---+-------+---------+
   |2  |200    |  M      |
   +---+-------+---------+
   |3  |300    |  A      |
   +---+-------+---------+

Что мне нужно сделать, это: Клиент вложил $ 100,00 в инвестиции C после 3 дни этот фонд принес 6% в соответствии с таблицей доходности столбца C. Поэтому мне нужно сложить сумму дохода за эти 3 даты ** (6%) ** и применить к стоимости его инвестиций $ 100 + 6% = $ 6.00

Вот выборка, которую я пытаюсь сделать, но я не могу сгенерировать выборку с помощью:

SELECT mov.tipo_fundo,

(mov.valor*(SELECT sum(rf.fundo_conservador) FROM `rentabilidade_fundos` rf where rf.data between
            CASE WHEN ((mov.data_solicitacao) <= (CURRENT_DATE()) ) 
                THEN mov.data_solicitacao
                ELSE (select last_day(curdate() - interval 1 month) + interval 1 day) 
            END                     
            and (select last_day(curdate())) ))/100 as REND_TOTAL_MES_CONSERVADOR,

(mov.valor*(SELECT sum(rf.fundo_moderado) FROM `rentabilidade_fundos` rf where rf.data between
            CASE WHEN ((mov.data_solicitacao) <= (CURRENT_DATE()) ) 
                THEN mov.data_solicitacao
                ELSE (select last_day(curdate() - interval 1 month) + interval 1 day) 
            END                     
            and (select last_day(curdate())) ))/100 as REND_TOTAL_MES_MODERADO,

(mov.valor*(SELECT sum(rf.fundo_arrojado) FROM `rentabilidade_fundos` rf where rf.data between
            CASE WHEN ((mov.data_solicitacao) <= (CURRENT_DATE()) ) 
                THEN mov.data_solicitacao
                ELSE (select last_day(curdate() - interval 1 month) + interval 1 day) 
            END                     
            and 
            (select last_day(curdate())) ))/100 as REND_TOTAL_MES_ARROJADO

from movimentacao mov where 1=1 and mov.tipo_movimento = 'A' and mov.id_usuario=6 GROUP by tipo_fundo

Вот как вам нужен выбор, чтобы выглядеть:

   FINAL SELECT

   +---+---------+---------+
   |id |tp_fundo |         |
   +---+---------+---------+
   |1  |C        | $6,00   |
   +---+---------+---------+
   |2  |M        | $18,00  |
   +---+---------+---------+
   |3  |A        | $36,0   |
   +---+---------+---------+

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Вы можете сделать:

select
  m.id,
  m.tp_fundo,
  sum(
    case when m.tp_fundo = 'C' then 0.01 else 0 end * m.valor * r.c +
    case when m.tp_fundo = 'M' then 0.01 else 0 end * m.valor * r.m +
    case when m.tp_fundo = 'A' then 0.01 else 0 end * m.valor * r.a
  ) as total
from mov m
cross join rent r
group by m.id, m.tp_fundo

Результат:

id  tp_fundo  total
--  --------  -----
 1  C             6
 2  M            18
 3  A            36

См. Пример работы на DB Fiddle .

0 голосов
/ 18 апреля 2020

Шаг 1. Исправьте вашу схему.

арендная плата может выглядеть следующим образом ...

   +------------+------+------+
   | date       | fund | rent |
   +------------+------+------+
   | 2020/01/01 | c    |    1 |
   | 2020/01/02 | c    |    2 |
   | 2020/01/03 | c    |    3 |
   | 2020/01/01 | m    |    2 |
   | 2020/01/02 | m    |    3 |
   | 2020/01/03 | m    |    4 |
   | 2020/01/01 | a    |    3 |
   | 2020/01/02 | a    |    4 |
   | 2020/01/03 | a    |    5 |
   +------------+------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...