Мне нужно создать две строки, содержащие итоги, в отличие от типичной строки итогов. Общие итоги и средние значения.
Я создаю отчет, используя базовый SQL, и я работаю с базой данных Oracle, но я не использую PL/SQL.
В настоящее время я использую Group By Grouping Sets для создания отчета, и одна строка — это строка, содержащая общие итоги. Эти итоги в настоящее время производятся с использованием SUM (столбец) с использованием сочетания агрегатных и аналитических функций для получения моей одной строки общих итогов. Мне нужна еще одна строка, которая выводит итоги по тому же набору данных. Каков наилучший способ добиться этого? Когда я говорю лучше всего, я думаю о нагрузке на мою базу данных, поскольку этот отчет будет работать с тоннами данных. Мои примеры чрезвычайно просты, но суть понятна.
Ниже приведены некоторые примеры данных, которые позволяют получить суммарные общие итоги с использованием наборов группировки. Чего не хватает, так это еще одной строки под общими итогами, которую я хотел бы получить в среднем.
WITH sample_data AS
(
SELECT 1 AS client_key, 'NASA' AS client, 8 AS SPACESHIPS_SOLD, 105585 AS REVENUE FROM DUAL UNION ALL
SELECT 2 AS client_key, 'Origin' AS client, 3 AS SPACESHIPS_SOLD, 36581 AS REVENUE FROM DUAL UNION ALL
SELECT 3 AS client_key, 'SpaceX' AS client, 7 AS SPACESHIPS_SOLD, 83851 AS REVENUE FROM DUAL
)
SELECT sd.client_key
, CASE WHEN grouping(sd.client) = 0 THEN to_char(sd.client) ELSE 'Grand Totals -->' END AS client
, SUM(sd.spaceships_sold) AS spaceships_sold
, SUM(sd.revenue) AS revenue
FROM sample_data sd
GROUP BY
GROUPING SETS (
(sd.client_key, sd.client),
()
)
;
Пример Изображение того, что я ищу.
Ниже приведены мои мысли о том, как я могу получить эту дополнительную строку итогов, но не уверен, что это то, что я должен делать, чтобы получить это. Кажется запутанным, и я продолжаю думать, что это должно быть существующей функцией групповых наборов. В приведенном ниже подходе я использую CTE и UNION ALL, чтобы получить дополнительные средние значения в нижней части моего набора данных, как показано на снимке экрана ниже.
SQL из приведенного выше снимка экрана.
WITH sample_data AS
(
SELECT 1 AS client_key, 'NASA' AS client, 8 AS SPACESHIPS_SOLD, 105585 AS REVENUE FROM DUAL UNION ALL
SELECT 2 AS client_key, 'Origin' AS client, 3 AS SPACESHIPS_SOLD, 36581 AS REVENUE FROM DUAL UNION ALL
SELECT 3 AS client_key, 'SpaceX' AS client, 7 AS SPACESHIPS_SOLD, 83851 AS REVENUE FROM DUAL
)
, data_Sum_totals AS
(
SELECT sd.client_key
, CASE WHEN grouping(sd.client) = 0 THEN to_char(sd.client) ELSE 'Grand Totals -->' END AS client
, SUM(sd.spaceships_sold) AS spaceships_sold
, SUM(sd.revenue) AS revenue
FROM sample_data sd
GROUP BY
GROUPING SETS (
(sd.client_key, sd.client),
()
)
)
, data_Avg_totals AS
(
SELECT grouping(sd.client_key) AS row_group
, sd.client_key
, CASE WHEN grouping(sd.client) = 0 THEN to_char(sd.client) ELSE 'AVG Totals -->' END AS client
, AVG(sd.spaceships_sold) AS spaceships_sold
, AVG(sd.revenue) AS revenue
FROM sample_data sd
GROUP BY
GROUPING SETS (
(sd.client_key, sd.client),
()
)
HAVING grouping(sd.client_key) = 1 /* This line restricts the output to only give me the Totals row */
)
SELECT client_key, client, spaceships_sold, revenue
FROM data_Sum_totals
UNION ALL
SELECT client_key, client, spaceships_sold, revenue
FROM data_Avg_totals
;