我想在Oracle中获取每小时的累计金额

I want to get the accumulated amount every hour in Oracle

`select
    order_price,
    To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd hh24') as order_date, 
SUM(order_price) OVER(ORDER BY To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd 
hh24')) as "bth" 
from order_tbl 
where seller_no=100 
order by order_date;`

我得到了这个结果。

但是我要获取的数据如下

20000 / 20220524 15 / 52500

13000 / 20220524 15 / 52500

19500 / 20220524 15 / 52500

19600 / 20220524 16 / 72100

222000 / 20220524 17 / 738700

即使没有数据...

0 / 20220524 18 / 738700

0 / 20220524 19 / 738700

0 / 20220524 20 / 738700 .

.

.

.

0 / 20220525 10 / 738700

13600 / 20220525 11 / 787300

像这样。

即使没有数据,我也想每小时获取 order_date 和 bth。

这对我来说太难了,但是我该怎么办?

我将删除 order_price 并稍后添加不同的。

您可以使用此查询 - 稍后解释:

select
    to_date('01/01/2022 00:00:00','dd/mm/yyyy hh24:mi:ss') + all_hours.sequence_hour/24 order_date_all, 
    order_price,
    To_char(order_date, 'yyyymmdd hh24') as order_date_real,
SUM(order_price) OVER(ORDER BY To_char(order_date, 'yyyymmdd hh24')) as "bth" 
from order_tbl ,
    (SELECT LEVEL sequence_hour
    FROM dual
    CONNECT BY LEVEL <= 10) all_hours
where    trunc((order_date(+)-to_date('01/01/2022 00:00:00','dd/mm/yyyy hh24:mi:ss'))*24) = all_hours.sequence_hour
and seller_no(+)=100 
order by 1;

说明:

  1. 你不需要执行 To_char(to_date(order_date,'YYYY-MM-DD HH24:MI:SS'),'yyyymmdd hh24') - 这意味着你需要“ order_date" 已经是日期并将其再次转换为日期。不需要
  2. 我添加了最大小时数 - 它是子查询 all_hours。仅举个例子,限制为10,你可以改成任何其他值
  3. 我添加了要显示数据“01/01/2022”的时间起点 - 如果需要,可以更改它。注意它出现在2个地方。
  4. 我用 order_tbl 添加了一个外连接 - 注意 where 条件中的“(+)”。如果您想在 order_tbl 上添加其他条件 - 请记住像我在“seller_no”
  5. 中所做的那样在列的右侧添加 (+)

您可以试试这个:(阅读下面的指南)

db<>fiddle

WITH all_hour AS (
    SELECT LEVEL AS hour
    FROM dual
    CONNECT BY LEVEL <= 24
), 
all_date AS (
    SELECT TO_CHAR(DATE'2022-05-24' + LEVEL - 1, 'YYYYMMDD') AS dt
    FROM dual
    CONNECT BY LEVEL <= (DATE'2022-05-27' - DATE'2022-05-24' + 1)
), 
all_date_hour AS (
    SELECT dt || ' ' || (CASE WHEN hour < 10 THEN '0' || TO_CHAR(hour) ELSE TO_CHAR(hour) END) AS order_date
    FROM all_date
    CROSS JOIN all_hour
), 
your_order AS (
    SELECT 
        order_price,
        TO_CHAR(TO_DATE(order_date,'YYYY-MM-DD HH24:MI:SS'),'YYYYMMDD HH24') AS order_date,
        seller_no
    FROM order_tbl
),
your_sum AS (
    SELECT adh.order_date, SUM(CASE WHEN yo.seller_no = 100 THEN yo.order_price ELSE 0 END) AS bth
    FROM all_date_hour adh
    LEFT JOIN your_order yo ON adh.order_date = yo.order_date
    GROUP BY adh.order_date
)

SELECT order_date, SUM(bth) OVER(ORDER BY order_date) AS bth
FROM your_sum
ORDER BY order_date;

总结:

(1) Table 1 : all_hour

  • 包括从 1 到 24 的数字

(2) Table 2 : all_date

  • 包括从“2022-05-24”到“2022-05-27”的日期。
  • 如果您喜欢的范围是“2022-01-01”到“2022-12-31”,只需更改“2022-05-24”(第 7 和 9 行)->“2022-01-01” ', 和 '2022-05-27'(第 9 行)-> '2022-12-31'

(3) Table 3 : all_date_小时

  • 包括 'YYYYMMDD HH24' 格式的日期,例如'20220524 01'
  • 这是交叉连接第一个和第二个的结果table

(4) Table 4: your_order

  • 与您的样本 table、order_tbl 相同,只是将 order_date 重新格式化为格式 'YYYYMMDD HH24',例如'20220524 01'

(5) Table 5: your_sum(尚未累积)

  • order_price 的简单求和,按 order_date
  • 分组
  • 此处使用左连接,以便包含来自 all_date_hour 的所有日期
  • 可以在 case 语句中添加任何附加条件(第 24 行)
  • 例如,参见(第 24 行)SUM(CASE WHEN yo.seller_no = 100 AND youradditionalcondition = somecondition THEN yo.order_price ELSE 0 END)

(6) 最终 Select 查询:

  • 这里使用SUM() OVER(ORDER BY *yourexpr*)
  • 进行累计