View не показывает тот же результат, что и команда с подзапросом в mariadb

#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 , чтобы получить сумму. Спасибо.