2016-01-26 2 views
1

У меня есть эта таблица Oracle, который я использую для событийГруппа событий по дате

CREATE TABLE EVENT(
    ID INTEGER NOT NULL, 
    SOURCE VARCHAR2(50), 
    TYPE VARCHAR2(50), 
    EVENT_DATE DATE, 
    DESCRIPTION VARCHAR2(100) 
) 
/

Я использую этот SQL запрос, чтобы получить данные по типу:

SELECT EVENT_DATE, SUM(CASE WHEN TYPE = 'Error' THEN 1 ELSE 0 END) AS ERROR, 
SUM(CASE WHEN TYPE = 'Warning' THEN 1 ELSE 0 END) AS WARN, 
SUM(CASE WHEN TYPE = 'Info' THEN 1 ELSE 0 END) AS INFO, 
SUM(CASE WHEN TYPE = 'Critical' THEN 1 ELSE 0 END) AS CRITICAL 
FROM EVENT E WHERE EVENT_DATE >= TRUNC(SYSDATE) - 7 
GROUP BY EVENT_DATE 
HAVING COUNT(CASE WHEN TYPE IN ('Info', 'Warning', 'Error', 'Critical') THEN 1 END) > 0 
ORDER BY EVENT_DATE 

Как я могу результат для день? Я хочу получать все события в течение 7 дней на каждый день. У меня должно получиться 7 строк данных

+0

вы уверены, что ваша дата не имеет метку времени? – durbnpoisn

+0

Пожалуйста, разместите данные примера, ваш текущий выход и нужный результат. –

+0

@durbnpoisn - У меня есть отметка времени –

ответ

2
SELECT trunc(EVENT_DATE) event_date, 
SUM(CASE WHEN TYPE = 'Error' THEN 1 ELSE 0 END) AS ERROR, 
SUM(CASE WHEN TYPE = 'Warning' THEN 1 ELSE 0 END) AS WARN, 
SUM(CASE WHEN TYPE = 'Info' THEN 1 ELSE 0 END) AS INFO, 
SUM(CASE WHEN TYPE = 'Critical' THEN 1 ELSE 0 END) AS CRITICAL 
FROM EVENT E 
WHERE EVENT_DATE >= TRUNC(SYSDATE) - 7 
GROUP BY trunc(EVENT_DATE) 
HAVING SUM(CASE WHEN TYPE IN ('Info', 'Warning', 'Error', 'Critical') THEN 1 ELSE 0 END) > 0 
ORDER BY trunc(EVENT_DATE) 
3

Конечно, ответ Дэвида Бахмана Jeppesen верен, но ваш запрос может быть упрощен.

HAVING условие может быть применен уже в WHERE уменьшая количество строк перед тем агрегацию:

SELECT trunc(EVENT_DATE) event_date, 
    SUM(CASE WHEN TYPE = 'Error' THEN 1 ELSE 0 END) AS ERROR, 
    SUM(CASE WHEN TYPE = 'Warning' THEN 1 ELSE 0 END) AS WARN, 
    SUM(CASE WHEN TYPE = 'Info' THEN 1 ELSE 0 END) AS INFO, 
    SUM(CASE WHEN TYPE = 'Critical' THEN 1 ELSE 0 END) AS CRITICAL 
FROM EVENT E 
WHERE EVENT_DATE >= TRUNC(SYSDATE) - 7 
    AND TYPE IN ('Info', 'Warning', 'Error', 'Critical') 
GROUP BY trunc(EVENT_DATE) 
ORDER BY trunc(EVENT_DATE) 
+0

Кроме того, можете ли вы показать мне, как я могу показать результат по часам? –

+0

@PeterPenzov: 'TRUNC' имеет необязательный параметр:' TRUNC (EVENT_DATE, 'HH') 'усекает до часа – dnoeth

+0

Еще один вопрос. Мне нужно передать trunc (EVENT_DATE) в качестве параметра. Что-то вроде trunc (?). Есть ли способ пропустить дни и часы в качестве параметра? –