2015-10-21 3 views
1

Мне нужно суммировать ежедневную таблицу еженедельно и ежемесячно динамически.Совокупные еженедельные ежемесячные данные с использованием SQL

DAILY_TABLE:

---------------------------------------------- 
SECTOR | AREA | STVAL |  HRDATE 
---------------------------------------------- 
    USJ | TD | 8 | 17-OCT-2015 00:00:00 
    USJ | TJ | 4 | 17-OCT-2015 00:00:00 
    USJ | TD | 8 | 18-OCT-2015 00:00:00 
    USJ | TJ | 4 | 18-OCT-2015 00:00:00 
    USJ | TD | 8 | 19-OCT-2015 00:00:00 
    USJ | TJ | 4 | 19-OCT-2015 00:00:00 
    USJ | TD | 8 | 20-OCT-2015 00:00:00 
    USJ | TJ | 4 | 20-OCT-2015 00:00:00 
    USJ | TD | 8 | 21-OCT-2015 00:00:00 
    USJ | TJ | 4 | 21-OCT-2015 00:00:00 
    USJ | TD | 8 | 22-OCT-2015 00:00:00 
    USJ | TJ | 4 | 22-OCT-2015 00:00:00 
    USJ | TD | 8 | 23-OCT-2015 00:00:00 
    USJ | TJ | 4 | 23-OCT-2015 00:00:00 
    USJ | TD | 8 | 24-OCT-2015 00:00:00 
    USJ | TJ | 4 | 24-OCT-2015 00:00:00 
    USJ | TD | 8 | 25-OCT-2015 00:00:00 
    USJ | TJ | 4 | 25-OCT-2015 00:00:00 

WEEKLY_TABLE:

---------------------------------------------- 
SECTOR | AREA | STVAL |  HRDATE 
---------------------------------------------- 
    USJ | TD | 16 | 18-OCT-2015 00:00:00 
    USJ | TJ | 8 | 18-OCT-2015 00:00:00 
    USJ | TD | 56 | 25-OCT-2015 00:00:00 
    USJ | TJ | 28 | 25-OCT-2015 00:00:00 

MONTHLY_TABLE:

---------------------------------------------- 
SECTOR | AREA | STVAL |  HRDATE 
---------------------------------------------- 
    USJ | TD | 72 | 25-OCT-2015 00:00:00 
    USJ | TJ | 36 | 25-OCT-2015 00:00:00 

Пусть , эта процедура не запускается на этой неделе, но работает на следующей неделе, она также должна собирать данные за предыдущую неделю и текущую неделю.

EDIT 1:

SELECT CAST(MIN([HRDATE]) AS VARCHAR(20)) 
     +' TO ' 
     + CAST(MAX([HRDATE]) AS VARCHAR(20)) AS HRDATE, 
     SUM(STVAL), 
     SECTOR, 
     AREA 
    FROM DAILY_TABLE 
GROUP BY HRDATE 
HAVING COUNT(DISTINCT[HRDATE]) = 7; 
+0

SELECT CAST (MIN ([HRDATE]) AS VARCHAR (20)) + К '+ CAST (MAX ([HRDATE]) AS VARCHAR (20)) AS HRDATE, SUM (STVAL), SECTOR, AREA FROM DAILY_TABLE. Я новичок в sql. GROUP BY HRDATE HAVING COUNT (DISTINCT [HRDATE]) = 7 –

+0

Вам нужно чистое решение SQL или PL/SQL? – diziaq

+0

pl sql процедура –

ответ

0

Эти две процедур, чтобы сделать еженедельный и ежемесячный учет, соответственно. Они схожи и отличаются только именами таблиц и расчетами «последнего дня периода».

CREATE OR REPLACE PROCEDURE make_week_accounting IS 
    l_last_date DATE; 
    -- the day you want to be the last in the week >> 1=SUNDAY, 2=MONDAY and so on 
    c_week_end_day CONSTANT NUMBER := 1; 
    c_long_time_ago CONSTANT DATE := DATE '1900-01-01'; 
BEGIN 

SELECT nvl(MAX(hrdate), c_long_time_ago) INTO l_last_date FROM weekly_table; 

INSERT INTO weekly_table(sector, area, stval, hrdate) 
SELECT sector, area, SUM(stval), month_end 
    FROM (
      SELECT sector, area, stval, trunc(next_day(hrdate, c_week_end_day)) AS week_end 
      FROM daily_table 
      WHERE hrdate > l_last_date 
     ) 
    GROUP BY sector, area, week_end; 

END; 
/

CREATE OR REPLACE PROCEDURE make_month_accounting IS 
    c_long_time_ago CONSTANT DATE := DATE '1900-01-01'; 
BEGIN 

SELECT nvl(MAX(hrdate), c_long_time_ago) INTO l_last_date FROM monthly_table; 

INSERT INTO monthly_table(sector, area, stval, hrdate) 
SELECT sector, area, SUM(stval), month_end 
    FROM (
      SELECT sector, area, stval, trunc(last_day(hrdate)) AS month_end 
      FROM daily_table 
      WHERE hrdate > l_last_date 
     ) 
    GROUP BY sector, area, month_end; 

END; 
/
+0

I am noy способен использовать next_day или last_day или dateadd. любая альтернатива? –

+0

@jo_develop, я не понимаю, почему вы не можете использовать их, если работаете в Oracle. – diziaq

+0

Это будет работать. Но можем ли мы расширить эту логику, чтобы я мог ежедневно выполнять ежемесячную и ежемесячную агрегацию? –

0

Настройка SQL Fiddle

Oracle 11g R2 Схема:

CREATE TABLE DAILY_TABLE (SECTOR,AREA,STVAL,HRDATE) AS 
      SELECT 'USJ', 'TD', 8, DATE '2015-10-17' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-17' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-18' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-18' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-19' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-19' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-20' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-20' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-21' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-21' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-22' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-22' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-23' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-23' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-24' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-24' FROM DUAL 
UNION ALL SELECT 'USJ', NULL, 4, DATE '2015-10-24' FROM DUAL 
UNION ALL SELECT 'USJ', 'TD', 8, DATE '2015-10-25' FROM DUAL 
UNION ALL SELECT 'USJ', 'TJ', 4, DATE '2015-10-25' FROM DUAL 
UNION ALL SELECT 'USJ', NULL, 4, DATE '2015-10-25' FROM DUAL 

Запрос 1:

SELECT SECTOR, 
     AREA, 
     SUM(STVAL) AS STVAL, 
     TRUNC(HRDATE,'IW') AS HRDATE 
FROM DAILY_TABLE 
GROUP BY 
     SECTOR, 
     AREA, 
     TRUNC(HRDATE,'IW') 

Results:

| SECTOR | AREA | STVAL |     HRDATE | 
|--------|--------|-------|---------------------------| 
| USJ | (null) |  8 | October, 19 2015 00:00:00 | 
| USJ |  TD | 16 | October, 12 2015 00:00:00 | 
| USJ |  TJ |  8 | October, 12 2015 00:00:00 | 
| USJ |  TD | 56 | October, 19 2015 00:00:00 | 
| USJ |  TJ | 28 | October, 19 2015 00:00:00 | 

Запрос 2:

SELECT SECTOR, 
     AREA, 
     SUM(STVAL) AS STVAL, 
     TRUNC(HRDATE,'MM') AS HRDATE 
FROM DAILY_TABLE 
GROUP BY 
     SECTOR, 
     AREA, 
     TRUNC(HRDATE,'MM') 

Results:

| SECTOR | AREA | STVAL |     HRDATE | 
|--------|--------|-------|---------------------------| 
| USJ |  TJ | 36 | October, 01 2015 00:00:00 | 
| USJ | (null) |  8 | October, 01 2015 00:00:00 | 
| USJ |  TD | 72 | October, 01 2015 00:00:00 | 
+0

Это не работает для некоторых случаев. Предположим, что область «null», тогда она не рассматривает эту строку. Он должен также заполнить это. –

+0

Как это «не работает»? Я только что обновил SQLFIDDLE с помощью значений «NULL», и он агрегирует их, если вам нужно другое поведение, вам лучше будет описать вашу проблему (и спросить ее как новый вопрос). – MT0

Смежные вопросы