2017-05-17 3 views
0

요약 데이터와 차트를 표시하는 웹 페이지 작성. 요약 데이터를 얻기위한 쿼리는 지나치게 복잡해 보이기 때문에 더 간단한 방법이 있어야합니다. 저는 주로 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 
+0

Ps, 기분이 좋아지면 그다지 복잡한 쿼리가 아닙니다. 한 장의 종이에있는 비즈니스의 전체 상태는 인쇄 될 때 약 56 페이지의 A4로 실행되는 SQL을가집니다. 그것은 복잡한 보고서였습니다. –

답변

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 개의 그룹을 수행합니다."라는 본질적으로 하나의 그룹은 날짜와 이름으로 구성됩니다 (단 한 줄만 출력됩니다) 그리고 다른 그룹은 아마도 이름으로되어 있습니다 (각 이름에 대한 합계가 출력됩니다).

그런 다음 피벗을 수행하십시오. 더 많은 정보를 원하면 'quotes in phrase'가 매뉴얼/웹에서 찾아 볼 것입니다.

이 모든 것이 조금 더러운 것입니다. 결국보고 도구가이 요약을 실제로 작성해야합니다. , 오라클보다는 오라클, 비록 DB를 유용하게도 네트워크 트래픽을 줄이기 위해 그룹화 (피벗을하지 않음)하지만

+0

Caius에게 감사드립니다. 저는 기존 테이블에서 벗어나 초기 테이블을 보고서에 더 잘 맞도록 처리하는 작업을 다시 시도했습니다. 이 최신보고 요청은 현재 테이블 구조가 얼마나 잘못 배치되었는지 강조 표시합니다. 큐브에 친숙한 테이블로 이동하면 도움이 될 수 있습니다. 나는 내 디자인과 그것을 적절하게 옮기는 방법을 살펴볼 것이다. –