У меня есть две проблемы, которые мне не удается решить.
- Показать разницу между значениями двух ячеек из разных таблиц
- Отображение пользовательского вывода на основе количества строк, возвращенных в подзапросе, и / или значения ячейки
В этом конкретном случае у меня есть несколько таблиц, которые необходимо объединить и объединить с пользовательскими выводами в одном запросе MySQL.
Таблицы, лишенные ненужных столбцов и с поддельными данными:
transactions
+----+-------------+------------+--------+
| id | vendor_id | payment_id | amount |
+----+-------------+------------+--------+
| 1 | 12 | 45 | 25 |
| 2 | 13 | 46 | 50 |
| 3 | 14 | 47 | 50 |
| 4 | 15 | 48 | 50 |
+----+-------------+------------+--------+
vendors
+-----+-------------+
| id | vendor_code |
+-----+-------------+
| 12 | abc123 |
| 13 | efg321 |
| 14 | hjk456 |
| 15 | fed789 |
+-----+-------------+
payments
+-----+-------+--------+
| id | order | amount |
+-----+-------+--------+
| 45 | 0032 | 25 |
| 46 | 0063 | 50 |
| 47 | 0073 | 50 |
| 48 | 0087 | 50 |
+-----+-------+--------+
refunds
+----+----------------+--------+
| id | transaction_id | amount |
+----+----------------+--------+
| 65 | 2 | 10 |
+----+----------------+--------+
properties
+-----+----------+
| id | group_id |
+-----+----------+
| 100 | 222 |
| 200 | 333 |
+-----+----------+
vendor_properties
+----+-------------+------------+
| id | property_id | vendor_id |
+----+-------------+------------+
| 1 | 100 | 12 |
| 2 | 200 | 12 |
| 3 | 100 | 13 |
| 4 | 200 | 14 |
+----+-------------+------------+
groups
+-----+---------+
| id | name |
+-----+---------+
| 222 | groupA |
| 333 | groupB |
+-----+---------+
Существуют следующие отношения:
transactions.payment_id -> payments.id
transactions.vendor_id -> vendors.id
payments.vendor_id -> vendors.id
refunds.transaction_id -> transactions.id
properties.property_group_id -> groups.id
vendor_properties.property_id -> properties.id
vendor_properties.vendor_id -> vendors.id
Мой текущий запрос SQL:
SELECT
`transactions`.`id` AS DB_transID,
`transactions`.`vendor_id` AS DB_vendID,
`vendors`.`vendor_code` AS "VendorCode",
`payments`.`order` AS "Order",
`transactions`.`amount` AS "Amount"
`refunds`.`amount` AS "Refunded",
`groups`.`name` AS "Group"
FROM
`transactions`
LEFT JOIN
`payments` ON `payments`.`id` = `transactions`.`payment_id`
LEFT JOIN
`vendors` ON `vendors`.`id` = `transactions`.`vendor_id`
LEFT JOIN
`refunds` ON `refunds`.`transaction_id` = `transactions`.`id`
LEFT JOIN
`groups` ON `groups`.`id` IN
(
SELECT `group_id` FROM `properties` WHERE `id` IN
(
SELECT `property_id` FROM `vendor_properties`
WHERE `vendor_id` = @refID
)
);
Вывод:
+------------+-----------+------------+-------+--------+----------+--------+
| DB_transID | DB_vendID | VendorCode | Order | Amount | Refunded | Group |
+------------+-----------+------------+-------+--------+----------+--------+
| 1 | 12 | abc123 | 0032 | 25 | NULL | groupA |
| 1 | 12 | abc123 | 0032 | 25 | NULL | groupB |
| 2 | 13 | efg321 | 0063 | 50 | 10 | groupA |
| 3 | 14 | hjk456 | 0073 | 50 | NULL | groupB |
| 4 | 15 | fed789 | 0087 | 50 | NULL | NULL |
+------------+-----------+------------+-------+--------+----------+--------+
Я бы хотел сделать следующее:
- Добавить столбец «Нетто», содержащий значение (Сумма - Возврат)
- Когда транзакция имеет более одной группы, как в транзакции 1, вместо создания двух строк я бы хотел одну строку с «groupA, groupB» в столбце Group. И когда Group имеет значение NULL, значение должно быть «None». Список имен групп должен быть дедуплицирован. Например, если группа «А» появляется в трех транзакциях, а группа «Б» - в двух транзакциях, результатом будет «группа А, группа В».
- Когда Refunded равен NULL, значение должно быть «0»
Таким образом, желаемый результат будет:
+------------+-----------+------------+-------+--------+----------+-----+----------------+
| DB_transID | DB_vendID | VendorCode | Order | Amount | Refunded | Net | Group |
+------------+-----------+------------+-------+--------+----------+-----+----------------+
| 1 | 12 | abc123 | 0032 | 25 | 0 | 25 | groupA, groupB |
| 2 | 13 | efg321 | 0063 | 50 | 10 | 40 | groupA |
| 3 | 14 | hjk456 | 0073 | 50 | 0 | 50 | groupB |
| 4 | 15 | fed789 | 0087 | 50 | 0 | 50 | None |
+------------+-----------+------------+-------+--------+----------+-----+----------------+
В реальной жизни в большинстве этих таблиц есть несколько тысяч строк. В качестве дополнительного вопроса, скажите мне, почему я иногда получаю NULL для группы, даже если данные таковы, что должно быть значение?
Любые дополнительные улучшения в запросе приветствуются!