【发布时间】:2019-07-06 15:34:09
【问题描述】:
是否可以在执行pivot后将表格水平和垂直汇总?
我已阅读并寻找可以使用汇总完成的内容,但缺点是列是动态的
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)"
)
);
【问题讨论】:
-
为什么要返回两行?你为什么要对
tax求和两次? -
您正在使用的表的结构(和/或示例数据)是什么?
-
@Gordon Linoff 税收我必须单独区分,因为它们对应于每篇文章,我正在使用 LAG 来获得那个枢轴
-
@Gdaimon 。 . . SQL 表代表 无序 集。您需要一列来指定税收与其所指项目之间的对应关系。而且,如果有这样的对应关系,重复计算税收是不正确的。
-
@Gordon Linoff 如果他们在表格和记录之间存在关系并且记录是唯一的,并且我正在做的是计算每篇文章的税收百分比,我已经将查询作为税收总额很大,但现在我需要区别对待