Oracle 按日期和数字查询条形图

Oracle query by date and number for bar chart

我有这个 table,我用它来存储 4 种类型的消息:信息、警告、警报和错误。

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

我需要在过去 15 天的条形图中按类型和日期显示事件,例如:

你能帮我查询这个 Oracle 吗?

查询的示例输出:

|11-12-2015 | 12 | 22 | 11 |
|12-12-2015 | 32 | 12 | 14 |
|13-12-2015 | 12 | 22 | 11 |
|14-12-2015 | 12 | 22 | 11 |

变体 A:逐行 您想要例如的数字 (=COUNT(*))特定 event_date 处特定来源的错误 (=TYPE) 事件。所以三元组 ( source, type, event_date) 构建了一个组,你想知道这个组中有多少个事件。

Select source, type, event_date, count(*) 
from events 
group by source, type, event_date;

有了这个结果就是

event_date  source  type   count
11-12-2015  server  error  12
11-12-2015  server  info   22
11-12-2015  server  warn   11
12-12-2015  server  error  32
12-12-2015  server  info   12
12-12-2015  server  warn   14

变体 B:并排

Select event_date, source, sum(error), sum(info), sum(warn)
From (select event_date, source, 
decode(Type, 'error', 1, 0) as error,
decode(Type, 'info', 1, 0) as info,
decode(Type, 'warn', 1, 0) as warn
From events)
Group by event_date, source;

你应该得到:

event_date  source  error  warn  info
11-12-2015  server   12    22    11
12-12-2015  server   32    12    14

decode 是某种 if-then-else。

可选:仅 15 天前 正如你所问。

简单地将 where 子句添加到(内部)select,如 where event_date >= sysdate - 15

Select source, type, event_date, count(*) 
from events 
where event_date >= sysdate - 15
group by source, type, event_date;

或 b)

Select event_date, source, sum(error), sum(info), sum(warn)
From (select event_date, source, 
decode(Type, 'error', 1, 0) as error,
decode(Type, 'info', 1, 0) as info,
decode(Type, 'warn', 1, 0) as warn
From events
where event_date >= sysdate - 15)
Group by event_date, source;

您可以只使用条件聚合:

select event_date,
       sum(case when type = 'Error' then 1 else 0 end) as Error,
       sum(case when type = 'Warn' then 1 else 0 end) as Warn,
       sum(case when type = 'Info' then 1 else 0 end) as Info
from events e
where event_date >= trunc(sysdate) - 15
group by event_date
order by event_date;

警告:如果名为 event_date 的字段实际上有一个时间部分,那么您应该在 selectgroup by.

中使用 trunc(event_date)