2014-12-10 4 views
1

мне нужно делать свою отчетность на неделе на неделе основе, но моя неделю номер должен начинаться с 1-го числа месяцакак преобразовать даты в неделю номера

вот мой пример данные:

report_date Vol 
01 nov 2014 23 
03 nov 2014 34 
16 nov 2014 56 
30 nov 2014 44 

Желаемых выход

Week no Vol 
1   57 
2   56 
3   0 
4   44 

надеяться свои четкие

Благодаря

ответ

0
select to_char(report_date, 'W'), sum(vol) 
from your_table 
group by to_char(report_date, 'W'); 

Вт Неделя месяца (1-5), где неделя 1 начинается в первый день месяца и заканчивается на седьмой.

+0

Почти: он хочет 0 пустых недель –

1

С нужного выводом включает «нулевые» строки, а также, и если вы хотели бы этот отчет, чтобы работать через несколько месяцев, а также:

WITH sample_data AS 
    (SELECT DATE '2014-11-01' AS report_date, 23 AS vol FROM DUAL 
UNION ALL SELECT DATE '2014-11-03', 34 FROM DUAL 
UNION ALL SELECT DATE '2014-11-16', 56 FROM DUAL 
UNION ALL SELECT DATE '2014-11-30', 44 FROM DUAL) 
,weeks AS 
    (SELECT report_month 
     ,TO_CHAR(ROWNUM) AS week_no 
    FROM (SELECT DISTINCT 
        TRUNC(report_date,'MM') AS report_month 
      FROM sample_data) 
    CONNECT BY LEVEL <= TO_NUMBER(TO_CHAR(LAST_DAY(report_month),'W'))) 
SELECT TO_CHAR(weeks.report_month,'Month') AS "Month" 
     ,weeks.week_no AS "Week no" 
     ,NVL(sum(sample_data.vol),0) AS "Vol" 
FROM weeks 
LEFT JOIN sample_data 
ON  weeks.report_month = TRUNC(report_date,'MM') 
AND weeks.week_no = to_char(report_date,'W') 
GROUP BY weeks.report_month, weeks.week_no ORDER BY 1,2; 

Определяет количество недель в каждом месяце исходных данных с помощью функции LAST_DAY, и мы выполняем иерархический запрос (CONNECT BY LEVEL <= n), чтобы генерировать по одной строке каждую неделю в каждом месяце.

Ожидаемый результат должен быть:

Month Week no Vol 
======== ======= === 
November 1  57 
November 2   0 
November 3  56 
November 4   0 
November 5  44 
Смежные вопросы