2014-09-15 2 views
0

FIDDLEнеделя интервал запроса, начиная с понедельника

мне нужно сделать JasperReport. то, что мне нужно отобразить, - это общее количество процессов счетов, разбитое на weekly intervals с number из activated и declined счетов.

Для еженедельного интервала запроса я получил до сих пор:

SELECT * 
FROM account_details 
WHERE DATE date_opened = DATE_ADD(2014-01-01, INTERVAL(1-DAYOFWEEK(2014-01-01)) +1 DAY) 

Это кажется правильным, но не POSTGRES правильно. Он продолжает жаловаться на 1-DAYOFWEEK. Вот то, что я надеюсь, достичь:

enter image description here

UPDATE Это очень некрасиво, но я не знаю лучше. Ид делает работу, хотя. Но не знаю, можно ли переусердствовать, по крайней мере, выглядеть лучше. Я также не знаю, как обрабатывать деление на ноль на данный момент.

 SELECT to_char(d.day, 'YYYY/MM/DD - ') || to_char(d.day + 6, 'YYYY/MM/DD') AS Month 
     , SUM(CASE WHEN LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END)  AS Activated 
     , SUM(CASE WHEN LOWER(situation) LIKE '%declined%' THEN 1 ELSE 0 END) AS Declined 
     , SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END) AS Total 
     , to_char(100.0 *((SUM(CASE WHEN LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END))/(SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END))::real) , '99.9') AS percent_activated 
     , to_char(100.0 *((SUM(CASE WHEN LOWER(situation) LIKE '%declined%' THEN 1 ELSE 0 END))/(SUM(CASE WHEN LOWER(situation) LIKE '%declined%' OR LOWER(situation) LIKE '%active%' THEN 1 ELSE 0 END))::real) , '99.9') AS percent_declined 
    FROM (
     SELECT day::date 
     FROM generate_series('2014-08-01'::date, '2014-09-14'::date, interval '1 week') day 
     ) d 
    JOIN account_details a ON a.date_opened >= d.day 
          AND a.date_opened < d.day + 6 
    GROUP BY d.day; 
+1

Литеральные значения даты и времени между единичными кавычками, как '' 2014-01-01''. –

+0

, в то время как 'SELECT 2014-01-01' * действителен *, он оценивает' 2012' - также вы совершенно неправильно поняли, что такое буквальный, и что такое вызов функции - посмотрите здесь: http: // www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-CONSTANTS-GENERIC - значения и выражения столбцов уже имеют тип, их не нужно * отмечать *, но иногда они должны быть * casted * http://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS – pozs

+0

Ссылка «Fiddle» не является скрипкой, а другая образ. Возможно, путаница ссылок? –

ответ

1
SELECT to_char(d.day, 'YYYY/MM/DD" - "') 
    || to_char(d.day + 6, 'YYYY/MM/DD') AS week 
    , count(situation ILIKE '%active%' OR NULL) AS activated 
    , ... 
FROM (
    SELECT day::date 
    FROM generate_series('2014-08-11'::date 
         , '2014-09-14'::date 
         , '1 week'::interval) day 
    ) d 
LEFT JOIN account_details a ON a.date_opened >= d.day 
          AND a.date_opened < d.day + 7 -- 7, not 6! 
GROUP BY d.day; 

Похожие ответы:

Больше о подсчете конкретных значений:

Помимо: Вы, как правило, использовать или справочную таблицу enum и просто хранить идентификатор для situation, а не длинный текст избыточностью.

+0

Erwin, спасибо за это, но у меня есть вопрос. в таблице 'account_details' столбец для уточнения, является ли учетная запись' active' или 'declined', является строкой. например, '' Active - No TopUp Allowed ''и' 'Application - Declined Cust No Contact" '. Как бы вы суммировали строковые значения? что-то вроде 'sum (LIKE ('active')) AS activated'? – morne

+0

или даже 'sum (SELECT regexp_matches (ситуация, 'активна')) AS активирована' where' situation' - это имя столбца – morne

+0

, если я могу обратиться к вам. http://stackoverflow.com/questions/25863179/capturing-and-summing-string-values-from-one-column/25863456#25863456 – morne

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