Мне нужно создать две строки, которые содержат итоги, в отличие от типичной строки итогов. Великие итоги и средние.
Я создаю отчет, используя базовый SQL, и я работаю с базой данных Oracle, но я не использую PL / SQL.
В настоящее время я использую наборы группировки по группам для создания отчета, а одна строка - это строка, содержащая итоговые итоги. Эти итоги в настоящее время производятся с использованием 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
;