【问题标题】:Seeking hints to simplify complex query寻求提示以简化复杂查询
【发布时间】:2017-05-17 21:56:44
【问题描述】:

构建网页以显示汇总数据和图表。获取我的摘要数据的查询似乎过于复杂,必须有更简单的方法来完成。我主要熟悉 SQL Server,在 SQL Server 下,获取行和列级别的总计是在主查询中完成的。除非您正在做一些更复杂的事情,否则不需要联合或子查询。 然而,在 Oracle 10g 下,这似乎是完成同样事情的方式。

将生成的数据放入 JSON 数组并填充 v1.10 数据表。

源数据有一行包含日期、项目和项目计数。 结束表使用数据透视表,变为 8 列,6 列用于项目,日期和行级总计。我修剪了 2 列以简化减少问题中的混乱。最后一行具有列级总计和最终总计。欢迎提出任何建议。

查询在这里

SELECT *
FROM ( 
   SELECT TO_CHAR("DATE", 'MM/DD/YYYY') AS "DATE"
         , ITEM_NAME
         , SUM(ITEM_COUNT) AS TOTAL
    FROM MY_VIEW
    WHERE 1=1
      AND "DATE" > ADD_MONTHS(TO_DATE(SYSDATE, 'DD-MM-RR'), -1)
      AND ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04') 
    GROUP BY "DATE", ITEM_NAME
    UNION ALL
    SELECT TO_CHAR("DATE", 'MM/DD/YYYY') AS "DATE"
         , 'ROW_TOTAL' AS ITEM_NAME
         , SUM(ITEM_COUNT) AS TOTAL
    FROM MY_VIEW
    WHERE 1=1
      AND "DATE" > ADD_MONTHS(TO_DATE(SYSDATE, 'DD-MM-RR'), -1)
      AND ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04') 
    GROUP BY "DATE"
)
PIVOT
(
  MAX(TOTAL) FOR ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04','ROW_TOTAL')
)    
UNION ALL
SELECT *
FROM (
   SELECT 'GRAND TOTAL' AS "DATE"
         , ITEM_NAME
         , SUM(ITEM_COUNT) AS TOTAL
    FROM MY_VIEW
    WHERE 1=1
      AND "DATE" > ADD_MONTHS(TO_DATE(SYSDATE, 'DD-MM-RR'), -1)
      AND ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04') 
    GROUP BY ITEM_NAME
    UNION ALL
       SELECT 'GRAND TOTAL' AS "DATE"
         , 'ROW_TOTAL' AS ITEM_NAME
         , SUM(ITEM_COUNT) AS TOTAL
    FROM MY_VIEW
    WHERE 1=1
      AND "DATE" > ADD_MONTHS(TO_DATE(SYSDATE, 'DD-MM-RR'), -1)
      AND ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04') 
)
PIVOT
(
  MAX(TOTAL) FOR ITEM_NAME IN ('ITEM-01','ITEM-02','ITEM-03','ITEM-04', 'ROW_TOTAL')
)    
ORDER BY 1

最终结果应该是这样的:

DATE    ITEM-01 ITEM-02 ITEM-03 ITEM-04 ROW_TOTAL
======================================================
4/18/17 1,063,008   460,436 106,715 97,532  1,829,364
4/19/17 1,061,819   479,338 103,946 108,179 1,859,825
4/20/17 1,095,853   536,835 107,437 101,949 1,944,677
4/21/17 1,153,345   642,364 108,940 106,988 2,121,068
4/22/17 1,075,849   633,873 102,459 99,999  2,012,710
4/23/17 913,952     591,783 95,291  100,144 1,794,358
4/24/17 1,036,377   626,043 115,105 98,339  1,977,043
4/25/17 1,079,163   602,237 118,189 100,478 2,001,529
4/26/17 1,110,499   639,640 109,793 103,360 2,069,311
4/27/17 1,119,696   620,081 105,781 108,276 2,061,452
4/28/17 1,125,676   618,763 113,234 96,326  2,057,169
4/29/17 1,026,974   620,059 102,856 96,150  1,940,394
4/30/17 903,913     539,694 83,531  97,073  1,716,114
5/1/17  1,043,598   590,027 100,272 96,519  1,932,843
5/2/17  1,074,912   623,392 101,793 97,724  2,000,981
5/3/17  1,078,865   620,662 101,699 102,900 2,010,014
5/4/17  1,090,501   628,785 110,248 103,593 2,040,658
5/5/17  1,125,984   686,945 128,657 105,356 2,150,037
5/6/17  1,031,267   625,189 117,290 99,358  1,967,819
5/7/17  921,467     551,497 97,482  93,520  1,752,940
5/8/17  1,064,291   624,366 93,463  98,860  1,979,863
5/9/17  1,085,062   661,509 97,791  98,083  2,039,114
5/10/17 1,103,794   634,868 94,364  102,345 2,033,911
5/11/17 1,107,449   617,931 94,420  103,717 2,024,126
5/12/17 1,130,463   647,744 97,616  102,684 2,079,009
5/13/17 1,056,653   621,182 96,743  99,801  1,974,710
5/14/17 970,969     583,865 87,953  97,682  1,831,516
5/15/17 1,075,979   633,102 95,356  101,336 2,003,830
5/16/17 1,094,805   634,421 96,802  99,533  2,026,891
GRAND TOTAL 30,822,183  17,596,631  2,985,226   2,917,804   57,233,276

【问题讨论】:

  • Ps,如果它让你感觉更好,那并不是一个复杂的查询。在我的上一个作业中,在一张纸上输出整个业务状态的单个报告有一个运行的 sql打印时约 56 页 a4。那是一份复杂的报告……

标签: oracle oracle10g


【解决方案1】:

如果您使用“分析查询”来执行总计而不需要运行单独的分组查询,它可能会更快。一个示例分析表达式可能是:

Select
  Sum(item_count) over(partition by date) --btw "date" is a poor name choice for a column
From
  Table
Where
  Item_name in ...

或者,使用“分组集”、“立方体”或“汇总”

区别? Analytics 建立分组特征,将额外的列添加到具有行聚合的报表中。分组集、多维数据集和汇总向具有列聚合的报表添加额外的行

很抱歉没有给出这方面的例子;它们是一个相当广泛的话题,需要深入讨论,所以它部分超出了我的回答范围,部分原因是我在 iPad 上写这篇文章,最近没有使用它们来从记忆中调用(这个话题太大了)并且没有办法测试或运行一个,所以我会把它作为你做进一步背景研究的指针。本质上,分组集是类似于“这是一个单一的数据集,迭代一次并在执行过程中按聚合执行这 N 个不同组的指令。”本质上,一个组将按日期和名称(因此输出单行) ) 而另一个 group by 可能是按名称 (因此每个名称的总数都被输出)..

然后做你的枢轴。有关更多信息,“引号中的短语”是您在手册/网络中查找的内容

顺便说一句,所有这些都有些肮脏。您的报告工具应该真正构建此摘要,而不是 oracle,尽管在数据库中进行分组(但不是旋转)有助于减少网络流量

【讨论】:

  • 谢谢 Caius,我已经考虑过从旧表移开并重新处理将初始表构建为更适合报告的处理。这个最新的报告请求强调了当前表格结构的布局有多糟糕。转移到立方体友好的桌子可能会有所帮助。我会研究我的设计以及如何适当地改变它。
猜你喜欢
  • 2012-11-17
  • 2021-11-12
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多