В первой статье были разобраны причины поиска решения по выводу корректных подытогов и итогов в сводных таблицах SuperSet, а также подробный разбор первого способа решения с помощью UNION. В данной статья я разберу второй способ, который мне больше нравится — это использование массивов.
Чтобы было более понятно, почему подобным образом собираем массив, рекомендую сначала ознакомиться со способом через UNION, описанным в первой части. Также в первой части подробно описано, почему мы добавляем невидимые символы и для чего. Здесь же кратко приведу SQL запрос, который в итоге приведет нас к такому же результату.
SELECT PERIOD, arrayJoin(REGION) AS REGION, arrayJoin(FRMT) as FRMT, LOST, SALE FROM ( SELECT DAY_ID AS PERIOD, array(CONCAT('ㅤㅤ',REGION), 'ㅤИтог по компании') AS REGION, array(CONCAT('ㅤㅤ',FORMAT), 'ㅤИтог') AS FRMT, Sum(LOST) AS LOST, Sum(SALE) AS SALE FROM temp.my_table WHERE DAY_ID BETWEEN CURDATE()-7 AND CURDATE() - 1 GROUP BY 1,2,3 )
Есть небольшой нюанс в таком способе. При подобном подходе сбор метрики требует небольших корректировок.
Чтобы наглядно продемонстрировать данный нюанс, построим сводную таблицу, в которой показатель Потери,% будет считаться как обычно:
divide(toFloat32(Sum(LOST)),Sum(SALE))

Сводная таблица будет иметь вид:

«Итог по компании» у нас также разбился на форматы. Такой вид данных тоже может быть кому‑то полезен, когда надо вывести еще и значение тотал по формату без разбивки по региону, но в данном случае нам надо оставить только строчку с итогом компании. Для этого расчет метрики Потери,% запишем следующим образом.
CASE WHEN REGION = 'ㅤИтог по компании' THEN divide(toFloat32(SumIf(LOST,FRMT='ㅤИтог')),SumIf(SALE,FRMT='ㅤИтог')) ELSE divide(toFloat32(Sum(LOST)),Sum(SALE)) END
не забываем про невидимые символы
После корректировки метрики в Итогах компании остается одна строчка.
Сводная таблица имеет финальный вид.

CSS код:
.pivot_table_v_2 table.pvtTable { width:55% !important; font-size: 12px !important; background-color: white; } /*задаем динамическую ширину сводной таблицы*/ .pvtTable { border: 2px solid lightgrey; border-radius: 5px; } /*граница вокруг всей сводной*/ .pivot_table_v_2 table.pvtTable tr th.pvtAxisLabel{ font-size: 0px; border-color: white; width: 0%; padding: 0px !important; } /*скрываем названия измерений слово metric и уменьшаем ширину*/ .pivot_table_v_2 table.pvtTable tr:nth-of-type(3) th.pvtAxisLabel { font-size: 13px; font-weight: 700; text-align: center; padding: 1px 8px !important; } /*название столбцов возвращаем*/ .pivot_table_v_2 table.pvtTable thead tr th.pvtTotalLabel { border: 0px solid white; padding: 0px !important; } /*убираем границы у левой ячейки в заголовках*/ .pivot_table_v_2 table.pvtTable thead tr:nth-of-type(1) th.pvtColLabel { color: black; text-align: center; font-size: 13px; font-weight: 600; padding: 1px 8px !important; border-left: 1px solid lightgrey; } /*подкрашиваем 1 строку заголовка в сводной*/ .pivot_table_v_2 table.pvtTable thead tr:nth-of-type(2) th.pvtColLabel { color: black; background-color: #dbdbdb; /*светло-серая заливка*/ text-align: center; font-size: 13px; font-weight: 600; padding: 1px 8px !important; text-wrap: nowrap!important; } /*подкрашиваем 2 строку заголовка в сводной*/ .pivot_table_v_2 table.pvtTable tr td.pvtVal { text-wrap: nowrap!important; text-align: center; padding: 1px 8px; vertical-align: middle; color: black; } /*параметры для значений сводных таблиц*/ .pivot_table_v_2 table.pvtTable tr th.pvtRowLabel { text-wrap: nowrap!important; padding: 1px 8px; font-size: 13px; vertical-align: middle !important; } /*в заголовках строк убираем перенос текста*/ .pivot_table_v_2 table.pvtTable tr:nth-of-type(1) th:nth-of-type(2).pvtRowLabel { font-size: 0px; border-left: none; } /*для итого компании убираем слово Итог в столбце форматов*/ /**** красные разделители*******/ .pivot_table_v_2 table.pvtTable tr:nth-of-type(1) .pvtVal, .pivot_table_v_2 table.pvtTable tr:nth-of-type(1) th.pvtRowLabel { border-top: 2px solid #a73333; } /*полоса под шапкой*/ .pivot_table_v_2 table.pvtTable thead tr:nth-of-type(n) th:nth-of-type(2).pvtColLabel, .pivot_table_v_2 table.pvtTable thead tr:nth-of-type(1) th:nth-of-type(3).pvtColLabel, .pivot_table_v_2 table.pvtTable td:nth-of-type(1).pvtVal, .pivot_table_v_2 table.pvtTable tbody tr.pvtRowTotals td:nth-of-type(1){ border-left: 2px solid #a73333; } /*полоса отделяем названия строк от значений*/ .pivot_table_v_2 table.pvtTable th.pvtRowLabel[rowspan]:not([rowspan="1"]) { border-top: 2px solid lightgrey !important; font-weight: 600; } /*граница первого столбца*/ .pivot_table_v_2 table.pvtTable tr:nth-of-type(-n+1) th:nth-of-type(-n+2).pvtRowLabel, .pivot_table_v_2 table.pvtTable tr:nth-of-type(-n+1) td.pvtVal { background: #FBEEEC; /*розовая заливка*/ font-weight: 600; } /*подкрашиваем и выделяем линией строку с итогом компании*/ .pivot_table_v_2 table.pvtTable tr:nth-of-type(n+2) th[rowspan="1"]:nth-of-type(2).pvtRowLabel, .pivot_table_v_2 table.pvtTable tr:nth-of-type(n+2):has(th[rowspan="1"]:nth-of-type(2).pvtRowLabel) .pvtVal { background:#dedede; /*светло-серая заливка*/ font-weight: 600; border-radius: 5px; vertical-align: middle; } /*подкрашиваем и выделяем линией подытог начиная со второй строки*/
Если у вас так же есть способы обхода подобной проблемы или улучшение предложенных решений, смело делитесь.