как показать итоговые значения разных столбцов при использовании LEFT JOIN и GROUP BY - PullRequest
1 голос
/ 03 октября 2019

Я работаю на сайте MLM. У него есть страница с именем my payouts, в которой есть таблица выплат двух типов i.e. silver_payout, golden_payout, а третья - Total Payout, которая является дополнением к обоим. Я хочу отображать выплаты по дате. Обе таблицы содержат столбец date.

Таблица выплат Silver *

sp_id | username |    name      | sp_income | admin_charge | tds | net_payout |    date
      |          |              |           |              |     |            |
  1   |  super   | Super Admin  |   750     |      75      | 38  |   637      |  2019-10-03
      |          |              |           |              |     |            |
  2   |  super   | Super Admin  |   750     |      75      | 38  |   637      |  2019-10-03

Таблица выплат Golden

gp_id | username |    name      | gp_income | admin_charge | tds | net_payout |    date
      |          |              |           |              |     |            |
  1   |  super   | Super Admin  |   750     |      75      | 38  |   637      |  2019-10-03
      |          |              |           |              |     |            |
  2   |  super   | Super Admin  |   750     |      75      | 38  |   637      |  2019-10-03

Это то, что я ожидаю как общая выплата

 id   | username | silver pay   | golden pay| total pay   | admin_charge| tds | net_payout |    date
      |          |              |           |             |             |     |            |
  1   |  super   | 1500         |   1500    |    3000     |    300      | 150 |  2550      |  2019-10-03

И это то, что я получаю как общая выплата

 id   | username | silver pay   | golden pay| total pay   | admin_charge| tds | net_payout |    date
      |          |              |           |             |             |     |            |
  1   |  super   | 3000         |   3000    |    6000     |    600      | 304 |  5096      |  2019-10-03


SELECT silver_payout.username, 
    COUNT(silver_payout.sp_id) AS id,
    SUM(silver_payout.sp_income) AS income,
    SUM(silver_payout.admin_charge) AS ach,
    SUM(silver_payout.tds) AS theTDS,
    SUM(silver_payout.net_payout) AS np,
    silver_payout.date AS sdate,
    golden_payout.username,
    COUNT(golden_payout.gp_id) AS gid, 
    SUM(golden_payout.gp_income) AS gold_income, 
    SUM(golden_payout.admin_charge) AS gach,
    SUM(golden_payout.tds) AS gtheTDS,
    SUM(golden_payout.nett_payout) AS gnp, 
    golden_payout.date AS gdate
FROM (silver_payout 
LEFT JOIN golden_payout
ON silver_payout.username = golden_payout.username)
WHERE silver_payout.username = '$search'
GROUP BY STR_TO_DATE(sdate,'%Y-%m-%d'), STR_TO_DATE(gdate,'%Y-%m-%d')

Любая помощь должна быть оценена.

1 Ответ

0 голосов
/ 03 октября 2019

Используйте union all и group by:

select username, name,
       sum(income * is_silver) as s_income,
       sum(income * is_gold) as g_income,
       sum(income) as total_income,
       . . .  -- continue for the rest of the columns
from ((select s.*, 1 as is_silver, 0 as is_gold
       from silver s
      ) union all
      (select g.*, 0, 1
       from gold
      )
     ) sg
where date = ?
group by username, name
...