Фильтр дашборда меняет суммы, но не колонку '% от общего' — исправьте ошибку области агрегации.
У дашборда продаж есть фильтр по региону. При выборе региона колонка total обновляется верно, но колонка pct_of_total не меняется, и колонка больше не даёт в сумме 100%.
Ограничения: Postgres; фильтр по региону — это показанный WHERE; pct_of_total должна быть долей каждой категории от текущего отфильтрованного итога.
SELECT
category,
SUM(amount) AS total,
100.0 * SUM(amount) / (SELECT SUM(amount) FROM sales) AS pct_of_total
FROM sales
WHERE region = 'EU'
GROUP BY category;
Найдите и исправьте ошибку, чтобы проценты учитывали фильтр.
Знаменатель — неотфильтрованный подзапрос — (SELECT SUM(amount) FROM sales) игнорирует WHERE, который учитывает числитель, — поэтому фильтр сдвигает числители, но не общую сумму, и колонка не даёт 100%. Фикс — SUM(SUM(amount)) OVER ().
- ✗Считать, что подзапрос наследует
WHEREвнешнего запроса - ✗Винить округление, когда неверна область знаменателя
- ✗Добавлять колонки в
GROUP BYвместо ограничения итога
- →Почему
SUM(SUM(amount)) OVER ()учитывает фильтр, а подзапрос нет? - →Как сделать знаменателем итог по региону вместо общей суммы?
Числитель SUM(amount) считается по строкам после WHERE region = 'EU', а знаменатель (SELECT SUM(amount) FROM sales) — это независимый подзапрос без фильтра, поэтому он всегда равен сумме по всей таблице. При выборе региона числители уменьшаются, а знаменатель — нет, и сумма колонки перестаёт быть 100%. Оконная функция SUM(SUM(amount)) OVER () вычисляется после WHERE и GROUP BY, то есть по тем же отфильтрованным и сгруппированным строкам:
SELECT
category,
SUM(amount) AS total,
100.0 * SUM(amount) / SUM(SUM(amount)) OVER () AS pct_of_total
FROM sales
WHERE region = 'EU'
GROUP BY category;
Теперь и числитель, и знаменатель ограничены фильтром, и колонка снова даёт 100%. Если параметр региона меняется, оба пересчитываются согласованно, без второго прохода по таблице.