Как объединить три запроса в mysql? - PullRequest
1 голос
/ 17 апреля 2020

У меня три запроса.

Первый запрос:

SELECT SUM(transaction.price)
FROM transaction
WHERE transaction_type='sell' AND transaction.customer_id=1

Второй запрос:

SELECT SUM(transaction.payment)
FROM transaction
WHERE transaction_type='sell' AND transaction.customer_id=1

Третий запрос:

SELECT SUM(transaction.price)
FROM transaction
WHERE transaction_type='return' AND transaction.customer_id=1

Все запросы работают отдельно, но я хочу объединить эти запросы. И мой результат должен быть как «ожидаемый результат».

expected result= ((result of the second query)+(result of the third query)) - (result of the first query)

Примечание: customer_id используется в качестве внешнего ключа.

Ответы [ 3 ]

1 голос
/ 17 апреля 2020

MySql будет оценивать логическое выражение типа transaction_type='sell' как 0 или 1 для false или true, поэтому вы можете упростить запрос следующим образом:

SELECT 
  SUM((transaction_type='sell') * (payment - price)) + 
  SUM((transaction_type='return') * price)
FROM transaction
WHERE customer_id=1

или проще:

SELECT 
  SUM((transaction_type='sell') * (payment - price) + (transaction_type='return') * price)
FROM transaction
WHERE customer_id=1
1 голос
/ 17 апреля 2020

Использовать условную агрегацию:

SELECT
    SUM(CASE WHEN transaction_type = 'sell'   THEN payment ELSE 0 END) +
    SUM(CASE WHEN transaction_type = 'return' THEN price ELSE 0 END) -
    SUM(CASE WHEN transaction_type = 'sell'   THEN price ELSE 0 END)
FROM `transaction`
WHERE customer_id = 1;
0 голосов
/ 17 апреля 2020

Используйте if для фильтрации столбцов, которые вы хотите суммировать.

SELECT
    SUM(IF(transaction_type = 'sell', transaction.price, 0)) sell_sum,
    SUM(IF(transaction_type = 'sell', transaction.payment, 0)) payment_sum,
    SUM(IF(transaction_type = 'return', transaction.price, 0)) return_sum
FROM transaction
WHERE transaction_type IN('sell', 'return') AND transaction.customer_id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...