寻求简化复杂查询的提示

时间:2017-05-17 21:56:45

标签: oracle oracle10g

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

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

源数据有一行包含日期,项目和项目数。 结束表使用一个数据透视表,变为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

1 个答案:

答案 0 :(得分: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 ...

或者,使用'分组',' cube'或者'汇总'

区别? Google Analytics(分析)会建立分组特征,这些特征会向报表添加额外的列以及行的聚合。分组集,多维数据集和汇总将额外的行添加到具有列

的聚合的报表中

抱歉没有举例说明这一点;它们是一个非常广泛的主题,需要进行深入的讨论,因此它部分超出了我的答案范围,部分原因是我在iPad上写这个,最近没有使用它们从记忆(主题是巨大的),没有办法测试或运行一个,所以我将它作为指针,让你做进一步的背景研究。基本上,分组集是类似于"这里的单个数据集的指令,迭代它一次并且当你去时通过聚合执行这N个不同的组。"基本上一个组将按日期和名称(因此输出单行),另一个组可能是按名称(因此输出每个名称的总数)..

然后做你的支点。有关详细信息,引号中的'短语'是您在手册/网页中查找的内容

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