#mysql #view #subquery
#mysql #Вид #подзапрос
Вопрос:
Дорогие,
Я попытался создать представление, которое суммирует транзакции по категориям (строка) и месяцам (столбцы) за один год, как это :
SELECT counterpart.id_category as catid, category AS Category, (
SELECT COALESCE(SUM(amount), 0)
FROM transaction
INNER JOIN counterpart
ON transaction.id_counterpart = counterpart.id_counterpart
WHERE YEAR(date) = YEAR(now())
AND MONTH(date) = 1
AND id_category = catid
) AS Jan, [...]
FROM transaction
INNER JOIN counterpart
ON transaction.id_counterpart = counterpart.id_counterpart
INNER JOIN category
ON counterpart.id_category = category.id_category
WHERE transaction.id_user = 2
AND YEAR(date) = YEAR(now())
GROUP BY category
Я не знаю, хороший это способ или нет, по крайней мере, он работает как отдельная команда, но не как view.
При просмотре WHERE id_category = catid
подзапрос for не работает должным образом.
Спасибо.
Ответ №1:
Я подозреваю, что условная агрегация была бы более уместной и быстрой, чем множество вложенных запросов.
например
SELECT counterpart.id_category as catid, category AS Category,
sum(case when month(date) = 1 then 1 else 0 end) as Jan,
sum(case when month(date) = 2 then 1 else 0 end) as feb,
sum(case when month(date) = 3 then 1 else 0 end) as Mar
FROM transaction
INNER JOIN counterpart
ON transaction.id_counterpart = counterpart.id_counterpart
INNER JOIN category
ON counterpart.id_category = category.id_category
WHERE transaction.id_user = 2
AND YEAR(date) = YEAR(now())
GROUP BY counterpart.id_category,category
Комментарии:
1. Это работает, спасибо. Я просто заменил
then 1
наthen amount
, чтобы получить сумму. Спасибо.