【问题标题】:Totalize a table horizontally and vertically pivot plsql汇总表水平和垂直枢轴plsql
【发布时间】: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 如果他们在表格和记录之间存在关系并且记录是唯一的,并且我正在做的是计算每篇文章的税收百分比,我已经将查询作为税收总额很大,但现在我需要区别对待

标签: sql oracle oracle11g


【解决方案1】:

使用条件聚合。你可以得到你想要的:

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 被计算了两次,所以我没有包括在内。我也不明白为什么您已经在一行中汇总了总和,为什么还要单独一行。

【讨论】:

  • 如果添加了其他物品(例如裤子),这将不起作用。是否有适用于动态数据的解决方案?
  • @John 。 . .我无法弄清楚OP真正需要什么。这是我能想到的最明智的解决方案。
  • @John 没错,这就是我遇到的不便,我必须动态地进行操作
  • @Gdaimon 不幸的是,没有通过 Oracle 的 SQL 进行数据透视的动态方法,而 SQL Server 有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2017-01-02
相关资源
最近更新 更多