Суммируйте таблицу по горизонтали и вертикали. - PullRequest
1 голос
/ 06 июля 2019

Можно ли суммировать таблицу по горизонтали и вертикали после выполнения разворота?

Я прочитал и искал, что можно сделать с помощью накопительного пакета, но недостатком является то, что столбцы являются динамическими

PRODUCT | VALUE
:------ | ----:
Shirts  |  1200
tax     |    15
Stocks  |   500
tax     |    20

Результат

SHIRTS | tax (Shirts) | STOCKS | tax (Stocks) | TOTAL
-----: | -----------: | -----: | -----------: | -----:
  1200 |           35 |    500 |           35 |    570
 TOTAL |           35 |    500 |           35 |    570

структура данных, которую я использую, является следующей, чтобы использовать сводку, но мы должны принять во внимание, что столбцы являются динамическими, и чтобы использовать сводку, я использую LISTAGG, чтобы построить строку для сводки

WITH test_data AS
(
  --PRODUCT | VALUE
  --:------ | ----:
  SELECT 1 AS ord, 'Shirts' AS product, 1200 AS value FROM dual UNION ALL
  SELECT 2 AS ord, 'tax',      15            FROM dual UNION ALL
  SELECT 3 AS ord, 'Stocks',   500           FROM dual UNION ALL
  SELECT 4 AS ord, 'tax',      20            FROM dual
)

--SELECT * FROM   test_data

, test_data_extended AS
(
  SELECT product, value, LAG(product, 1) OVER (ORDER BY ord) AS pre_product
  FROM test_data
)

, test_data_new AS
(
  SELECT product AS old_product, value, CASE WHEN product = 'tax' THEN 'tax (' || pre_product || ')' ELSE product END AS new_product
  FROM test_data_extended
), new_data AS
(
  SELECT new_product, value
  FROM test_data_new
)    
SELECT * FROM new_data
PIVOT 
( 
  SUM( value )
  FOR new_product IN 
  (
    'Shirts'       AS "Shirts",
    'tax (Shirts)' AS "tax (Shirts)",
    'Stocks'       AS "Stocks",
    'tax (Stocks)' AS "tax (Stocks)"
  )
);

1 Ответ

0 голосов
/ 06 июля 2019

Использовать условную агрегацию. Вы можете получить то, что вы хотите, как:

select sum(case when product = 'Shirts' then value end) as shirts,
       sum(case when product = 'tax' then value end) as tax_1,
       sum(case when product = 'Stock' then value end) as stock,
       sum(case when product = 'tax' then value end) as tax_2 ,
       sum(value) as total     
from t;

Я не понимаю ваш формат данных, где tax учитывается дважды, поэтому я не включил его. Я также не понимаю, почему у вас есть отдельная строка для итога, когда вы уже суммируете вещи в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...