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
的字段实际上有一个时间部分,那么您应该在 select
和 group by
.
中使用 trunc(event_date)
我有这个 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
的字段实际上有一个时间部分,那么您应该在 select
和 group by
.
trunc(event_date)