【问题标题】:Stored procedure or SQL to execute 1-2 times daily - Oracle存储过程或 SQL 每天执行 1-2 次 - Oracle
【发布时间】: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


【解决方案1】:

您可以使用 PIVOT 查询 (https://www.techonthenet.com/oracle/pivot.php) 或尝试类似的方法

SELECT log_message_date, 
       30 AS frequency, 
       e1_count, 
       Round(e1_count/total*100), 
       e2_count, 
       Round(e2_count/total*100), 
       e3_count, 
       Round(e3_count/total*100), 
       e4_count, 
       Round(e4_count/total*100), 
       e5_count, 
       Round(e5_count/total*100) 
FROM  ( 
                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",
                         count(emoji) AS total, 
                         trunc(ts_create)                       AS log_message_date 
                FROM     reports 
                WHERE    ts_create > trunc(SYSDATE) - 30 
                GROUP BY trunc(ts_create))

【讨论】:

  • 我收到 ORA-00904:“E5_COUNT”:无效标识符 00904。00000 - “%s:无效标识符”行“Round(e5_count/total*100)”
  • 在创建一个新表 FREQUENCY_TBL 后,我还尝试了一个稍微不同的变体,其字段名为 FREQUENCY 记录,值为 7、30、60、90....我能够使计数工作,但百分比仍然不对....使用新查询编辑原始帖子
  • 抱歉,丢失了
  • 谢谢,但仍然失败:ORA-00904:“E5_COUNT”:无效标识符 00904。00000 -“%s:无效标识符”*原因:*操作:行错误:12 列:14对于 Round(e5_count/total*100) 行
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 2015-08-28
相关资源
最近更新 更多