Возвращается только одна строка!но ожидаемый вывод для всех пользователей - PullRequest
0 голосов
/ 08 апреля 2019

у меня есть три столовых обеда, счет, пользователи!Я хочу рассчитать для каждого пользователя общие расходы, общие затраты из этих таблиц !!в одном запросе!я столкнулся с проблемой в расчете общей стоимости !!

общая стоимость = стоимость еды * общая еда на пользователя

(стоимость еды = сумма всех расходов пользователя / сумма всех пользователей еды) !!

когда я ром свой ниже запрос, он возвращает только одну строку!Я попробовал группу, но это дает мне неправильный вывод :( Кто-нибудь может мне помочь ??

 {
    SELECT u.name , 
           ((SUM(tot_expenseamount)/ SUM(tot_noofmeal))*tot_noofmeal) as total_Cost,
           IFNULL(t.tot_expenseamount,0) AS tot_expense_amount ,
           IFNULL(n.tot_noofmeal,0) AS tot_no_of_meal 
    FROM users u
    LEFT JOIN (
        SELECT e.user_id , SUM(e.expenseamount) AS tot_expenseamount 
        FROM expenses e 
        WHERE e.expensedate >= '2019-04-01' + INTERVAL 0 MONTH AND e.expensedate < '2019-04-01' + INTERVAL 1 MONTH
        GROUP BY e.user_id ) t ON t.user_id = u.id
    LEFT JOIN (
        SELECT m.user_id , SUM(m.noofmeal) AS tot_noofmeal 
        FROM meals m 
        WHERE m.mealdate >= '2019-04-01' + INTERVAL 0 MONTH AND m.mealdate < '2019-04-01' + INTERVAL 1 MONTH
        GROUP BY m.user_id ) n ON n.user_id = u.id 
    ORDER BY u.name

обеденный стол

расходный стол

таблица пользователей

ожидаемый результат

1 Ответ

0 голосов
/ 08 апреля 2019

Я переписал это для вас.

Если вы используете MySQL 8.0.2 +:

SELECT u.name 
     , (expense.TotalExpenseAmount / SUM(MealCount) OVER ()) * MealsPerUser.MealCount
  FROM users u
 CROSS 
  JOIN (SELECT SUM(e.expenseamount) AS TotalExpenseAmount 
          FROM expenses e 
         WHERE e.expensedate >= '2019-04-01' + INTERVAL 0 MONTH AND e.expensedate < '2019-04-01' + INTERVAL 1 MONTH
     ) expense
  LEFT 
  JOIN (SELECT m.user_id, SUM(m.noofmeal) AS MealCount 
          FROM meals m 
         WHERE m.mealdate >= '2019-04-01' + INTERVAL 0 MONTH AND m.mealdate < '2019-04-01' + INTERVAL 1 MONTH
         GROUP BY m.user_id
     ) MealsPerUser
    ON MealsPerUser.user_id = u.id 
 ORDER BY u.name

Если нет, то оно становится еще более запутанным:

SELECT u.name 
     , (expense.TotalExpenseAmount / meals.TotalMealCount) * MealsPerUser.MealCount
  FROM users u
 CROSS 
  JOIN (SELECT SUM(e.expenseamount) AS TotalExpenseAmount 
          FROM expenses e 
         WHERE e.expensedate >= '2019-04-01' + INTERVAL 0 MONTH AND e.expensedate < '2019-04-01' + INTERVAL 1 MONTH
     ) expense
 CROSS
  JOIN (SELECT SUM(m.noofmeal) AS TotalMealCount
          FROM meals m 
         WHERE m.mealdate >= '2019-04-01' + INTERVAL 0 MONTH AND m.mealdate < '2019-04-01' + INTERVAL 1 MONTH
     ) meals
  LEFT 
  JOIN (SELECT m.user_id, SUM(m.noofmeal) AS MealCount 
          FROM meals m 
         WHERE m.mealdate >= '2019-04-01' + INTERVAL 0 MONTH AND m.mealdate < '2019-04-01' + INTERVAL 1 MONTH
         GROUP BY m.user_id
     ) MealsPerUser
    ON MealsPerUser.user_id = u.id 
 ORDER BY u.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...