Как отобразить несколько строк в таблице с одной строкой в ​​другой таблице после некоторых вычислений - PullRequest
1 голос
/ 25 октября 2011

У меня есть две таблицы.Таблица «user» содержит user_id, user_name.Таблица «Транзакции» содержит user_id, транзакции

Например: TABLE USER:

+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 1       | Ram       |
| 2       | John      |
+---------+-----------+

TABLE Транзакции

+---------+---------+--------------+
| user_id | type    | transactions |
+---------+---------+--------------+
| 1       | credit  | 500          |
| 1       | debit   | 300          |
| 2       | credit  | 250          |
| 1       | credit  | 450          |
| 2       | credit  | 100          |
| 1       | debit   | 250          |
| 2       | debit   | 50           |
+---------+---------+--------------+

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

+-----------+--------------+-------------+-------------+
| user_name | Total Credit | Total debit | Grand Total |
+-----------+--------------+-------------+-------------+
| Ram       | 950          | 550         | 400         |
| John      | 350          | 50          | 300         |
+-----------+--------------+-------------+-------------+

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 25 октября 2011

Как всегда, существует более одного способа снятия шкуры с кошки!:

SELECT u.user_name, t2.TotCredit, t1.TotDebit, (t2.TotCredit-t1.TotDebit) AS "GrandTotal"     
  FROM (SELECT user_id, SUM(transactions) AS "TotCredit" FROM transactiONs WHERE Type='Credit'GROUP BY user_id) AS t2     
LEFT OUTER JOIN      
    (SELECT user_id, SUM(transactions) AS "TotDebit" FROM transactiONs WHERE Type='Debit'GROUP BY user_id) AS t1     
  ON t1.user_id = t2.user_id     
LEFT OUTER JOIN      
    (SELECT user_name,user_id FROM user GROUP BY user_name) AS u     
  ON u.user_id = t2.user_id     

GROUP BY t2.user_id     
ORDER BY t2.user_id
1 голос
/ 25 октября 2011

Вот запрос:

SELECT
    u.user_name, 
    SUM(IF(t.type = 'credit', t.transactions, 0)) AS totalcredit,
    SUM(IF(t.type = 'debit', t.transactions, 0)) AS totaldebit,
    SUM(IF(t.type = 'credit', -1, 1) * t.transactions) AS total
FROM
    transactions t
INNER JOIN
    users u
ON
    u.user_id = t.user_id
GROUP BY
    u.user_name
0 голосов
/ 25 октября 2011

Попробуйте следующий запрос

SELECT u.user_name,
     SUM((IF(c.type = "credit", c.transactions, (0)))) AS total_credit,
     SUM((IF(c.type = "debit", c.transactions, (0)))) AS total_debit,
     SUM(IF(c.type = "credit", c.transactions, (0 - c.transactions))) AS grand_total
FROM
  credit_debit AS c
INNER JOIN user_details AS u
  ON c.user_id = u.user_id
GROUP BY
  u.user_id

Предположим, что будут присутствовать только типы дебетов и кредитов, если появятся другие типы, вам необходимо изменить код.

...