【发布时间】:2018-01-25 07:21:11
【问题描述】:
我正在使用具有表情符号列(可能值为 1、2、3、4、5)的单个巨大 oracle 表呈现报告。我目前正在为每个报告查询进行每个表情符号的实时计数(*)和百分比计数。我可以选择生成 7 天、30 天、60 天和 90 天的报告。
我的问题: - 运行存储的 proc/SQL 以将每个表情符号的计数和百分比计数存储在单独的表中,每天 1-2 次。 - 如果是新的则插入,更新它现有的。每天将插入/更新 4 条记录,频率为 7、30、60 和 90 天各一条。 - 每天早上 6 点和/或下午 6 点通过调度程序运行。
我的架构
desc reports;
MESSAGE_ID NOT NULL NUMBER(10)
USER_ID NOT NULL VARCHAR2(10)
EMOJI NOT NULL NUMBER(2)
MESSAGE VARCHAR2(140)
TS_CREATE NOT NULL TIMESTAMP(0)
TS_UPDATE NOT NULL TIMESTAMP(0)
我目前从 java 程序查询 30 天和 60 天的频率:
select emoji, COUNT(1) Total_emoji_count,
ROUND(RATIO_TO_REPORT(COUNT(1)) OVER() * 100,2) Total_emoji_percent
FROM reports where ts_create > sysdate - 30 GROUP BY emoji ORDER BY emoji;
select emoji, COUNT(1) Total_emoji_count,
ROUND(RATIO_TO_REPORT(COUNT(1)) OVER() * 100,2) Total_emoji_percent
FROM reports where ts_create > sysdate - 60 GROUP BY emoji ORDER BY emoji;
这会返回:
但是,为了便于阅读,我希望将行显示为列。每天都会插入这样的东西。
我尝试了以下 SQL,我可以得到计数,但无法让百分比起作用。有什么指点吗?
SELECT SUM(DECODE(emoji, 1, count(1), 0)) "e1_count",
SUM(DECODE(emoji, 2, count(1), 0)) "e2_count",
SUM(DECODE(emoji, 3, count(1), 0)) "e3_count",
SUM(DECODE(emoji, 4, count(1), 0)) "e4_count",
SUM(DECODE(emoji, 5, count(1), 0)) "e5_count"
FROM reports where ts_create > trunc(sysdate) - 30
GROUP BY emoji ORDER BY emoji;
编辑——新变种
emoji_FREQ as (
select
trunc(sysdate),
f.FREQUENCY,
m.emoji,
COUNT(1) e_count,
RATIO_TO_REPORT(COUNT(1)) OVER() * 100 e_percent
FROM reports m, FREQUENCY_TBL f
where m.ts_create > trunc(sysdate) - f.FREQUENCY
GROUP BY FREQUENCY, emoji
) SELECT
trunc(sysdate),
FREQUENCY,
SUM(DECODE(emoji, 1, e_count, 0)) e1_count,
SUM(DECODE(emoji, 2, e_count, 0)) e2_count,
SUM(DECODE(emoji, 3, e_count, 0)) e3_count,
SUM(DECODE(emoji, 4, e_count, 0)) e4_count,
SUM(DECODE(emoji, 5, e_count, 0)) e5_count,
SUM(DECODE(emoji, 1, e_percent, 0)) e1_percent,
SUM(DECODE(emoji, 2, e_percent, 0)) e2_percent,
SUM(DECODE(emoji, 3, e_percent, 0)) e3_percent,
SUM(DECODE(emoji, 4, e_percent, 0)) e4_percent,
SUM(DECODE(emoji, 5, e_percent, 0)) e5_percent
FROM emoji_FREQ
GROUP BY FREQUENCY;
【问题讨论】:
-
您在寻找PIVOT吗?
-
是的,PIVOT 很好,如果简单的解码是不可能的。稍后我将使用此“选择”将 3 行插入另一个表。
标签: sql oracle stored-procedures decode dbms-scheduler